Codeforces Round #716 (div.2)
A
题意
给定一个长度为\(n(1\leq n\leq 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\n",f?"YES":"NO");
}
}
B
题意
给出\(n(1\leq n\leq 1e5)\)和\(k(1\leq k\leq 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\n",ans);
}
}
C
题意
给出\(n(2\leq n\leq 1e5)\),找到序列\([1,2,\cdots,n-1]\)的最长子序列,子序列中所有元素的乘积模\(n\)等于\(1\)
题解
首先,子序列中所有元素必须与\(n\)互质,因为如果有元素与\(n\)不互质,则所有元素的乘积与\(n\)不互质,\(gcd(prod,n)\neq 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\n",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\n",res[cnt-1]);
}
else{
printf("%d\n",cnt);
for(int i=0;i<cnt-1;i++){
printf("%d ",vec[i]);
}
printf("%d\n",vec[cnt-1]);
}
}