思维

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个数的序列,使其满足下列条件,问你能构造出多少种序列;

  1. 序列里的每一个元素范围都在图片说明
  2. 序列里的元素全部相与结果为0;
  3. 让序列的总和尽可能的大。

思路:总和尽可能的大,我们可以先使每一个数的二进位都为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;
}
全部评论

相关推荐

03-16 11:07
南开大学 Java
牛马人的牛马人生:快手卡实习经历的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务