思维
A.
题意:给你一个数组问它的所有每一个数组子序列的乘积是否一个平方数;子序列:在数组中删除一些数形成的序列。
思路:它的乘积要是平方数,那么它的序列里的每一个数都应该是平方数相乘之后才能够开方。所以只需要判断数组里头的每一个数是否都为平方数就可以,
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int a[N];
bool check(int n){
int t=sqrt(n);
if(t*t==n) return true;
return false;
}
int main(){
int T,n,x;
cin>>T;
while(T--){
cin>>n;
int flag=1;
for(int i=0;i<n;i++){
cin>>x;
if(!check(x)){
flag=0;
}
}
if(!flag) puts("Yes");
else puts("NO");
}
}
B.
题意;给你n和k,让你构造一个n个数的序列,使其满足下列条件,问你能构造出多少种序列;
- 序列里的每一个元素范围都在
- 序列里的元素全部相与结果为0;
- 让序列的总和尽可能的大。
思路:总和尽可能的大,我们可以先使每一个数的二进位都为1,即 ,又要使全部相与为0;那每一位二进制都至少要有一个0,k个二进制位,n个数,每个二进制都有n种选择,所以答案就是
代码:
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
#define sc(n) scanf("%d",&n);
typedef long long ll;
const int MOD=1000000007;
const int N=100010;
int a[N];
ll qpow(ll a,ll b){k//快速幂取模
ll res=1;
while(b){
if(b&1) res=res*a%MOD;
a=a*a%MOD;
b>>=1;
}
return res;
}
int main(){
int T,n,k;
cin>>T;
while(T--){
cin>>n>>k;
printf("%lld\n",qpow(n,k));
}
return 0;
}
C
题意:给你两个数a,b;让你找出三个数x,y,z;要满足x+y=z,且x,y都是a的倍数,z是a*b的倍数;问是否存在这样的三个数,如果存在输出YES和一组x,y,z;不存在输出NO;
思路:首先要满足x+y=z;可以先令x=b-1,y=b+1,z=2b;根据倍数关系可以分别令xa,ya,za*b;考虑一下答案不存在的情况,b=1的时候是没有的,b-1=0,无法构造。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define sc(n) scanf("%d",&n)
#define print(n) printf("%d\n",n)
#define endl "\n";
#define ios ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
const int N=1000010;
const int MOD = 1e9 + 7;
const int INF=1e9;
const double eps=1e-5;
int n,m;
int a[N],b[N];
int main(){
int t;
cin>>t;
ll a,b;
while(t--){
cin>>a>>b;
if(b==1) {
puts("NO");
continue;
}
//ll aa,bb,cc;
puts("YES");
printf("%lld %lld %lld\n",(b-1)*a*1ll,(b+1)*a*1ll,2*b*a*1ll);//开始写的%ld,wa了一次,真的是***
}
return 0;
}
D
思路:将式子 ,变形一下,可以得到,
,就是将数组里的每一个数就减去一个他的下标i,问重复的个数,把重复的个想加起来就是答案。可以用map计数,也可以用一个桶计数。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define sc(n) scanf("%d",&n)
#define print(n) printf("%d\n",n)
#define endl "\n";
#define ios ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
const int N=1000010;
const int MOD = 1e9 + 7;
const int INF=1e9;
const double eps=1e-5;
int n,m;
//int a[N],b[N];
int poww(int x){
return x*x;
}
void solve(){
sc(n);
ll ans=0;
map<int,int>a;
for(int i=1;i<=n;i++) {
int x;
sc(x);
x-=i;
ans+=a[x];
a[x]++;
}
cout<<ans<<endl;
}
int main(){
int t;
sc(t);
while(t--){
solve();
}
return 0;
}