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]);
}
}