Codeforces Round #716 (div.2)

A

题意

给定一个长度为(n(1leq nleq 100))的序列(a),判断是否存在(a)的子序列(b),使得(b)中所有元素的乘积不是完全平方数

题解

由于(a^2*b^2*...=(a*b*...)^2),所以如果序列中的任意元素都是完全平方数,则不满足条件,否则满足条件

#include<bits/stdc++.h>
#define LL long long
using namespace std;

const int maxn=110;
int T,n,a[maxn];

int main(){
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        bool f=false;
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            int t=sqrt(a[i]);
            if(t*t!=a[i]) f=true;
        }
        printf("%s
",f?"YES":"NO");
    }
}

B

题意

给出(n(1leq nleq 1e5))(k(1leq kleq 20)),计算满足条件的长度为(n)的序列个数
·所有元素大小均在([0,2^k-1])
·所有元素的与是零
·所有元素的和最大

题解

每一位只有一个元素为零,由于有(n)个数和(k)位,所以结果为(n^k)

#include<bits/stdc++.h>
#define LL long long
using namespace std;

const int mod=1e9+7;
int T,n,k;

int main(){
    scanf("%d",&T);
    while(T--){
        scanf("%d %d",&n,&k);
        LL ans=1;
        for(int i=1;i<=k;i++){
            ans=ans*n%mod;
        }
        printf("%lld
",ans);
    }
}

C

题意

给出(n(2leq nleq 1e5)),找到序列([1,2,cdots,n-1])的最长子序列,子序列中所有元素的乘积模(n)等于(1)

题解

首先,子序列中所有元素必须与(n)互质,因为如果有元素与(n)不互质,则所有元素的乘积与(n)不互质,(gcd(prod,n) eq 1),所以乘积模(n)不为(1)
所以找到所有与(n)互质的数,将它们乘起来,如果乘积模(n)不为(1),则由于余数与(n)互质,在选取的数中删掉这个数即可

#include<bits/stdc++.h>
#define LL long long
using namespace std;

int n;
vector<int> vec,res;

int main(){
    scanf("%d",&n);
    int cnt=0;
    LL ans=1;
    for(int i=1;i<n;i++){
        if(__gcd(i,n)==1){
            cnt++;
            vec.push_back(i);
            ans=ans*i%n;
        }
    }
    if(ans!=1){
        printf("%d
",cnt-1);
        for(int i=0;i<cnt;i++){
            if(vec[i]!=ans) res.push_back(vec[i]);
        }
        cnt--;
        for(int i=0;i<cnt-1;i++){
            printf("%d ",res[i]);
        }
        printf("%d
",res[cnt-1]);
    }
    else{
        printf("%d
",cnt);
        for(int i=0;i<cnt-1;i++){
            printf("%d ",vec[i]);
        }
        printf("%d
",vec[cnt-1]);
    }
}

D

E

原文地址:https://www.cnblogs.com/fxq1304/p/14679369.html