A.Odd Set
思路:
判断奇偶个数是否相等。
代码:
int a[maxn];
void solve(){
int n=read,cnt0=0,cnt1=0;
rep(i,1,2*n){
a[i]=read;
if(a[i]&1) cnt1++;
else cnt0++;
}
if(cnt0==cnt1) puts("Yes");
else puts("No");
}
int main(){
int _=read;
while(_--){
solve();
}
return 0;
}
B.Plus and Multiply
思路:
首先,当(n)为(a^{x}+y*b)的形式时才在集合里。
只需要枚举(x),判断余数能否整除(b)即可。
注意:
(1.)特判(a==1)的情况
(2.)当余数为(0)时退出,输出No
(3.)先判断余数是否为(0)再判断能否整除(b)
代码:
ll t[maxn],idx;
void solve(){
ll n=read,a=read,b=read;
if(a==1){
if((n-1)%b==0) puts("Yes");
else puts("No");
return ;
}
idx=0;
for(int i=0;;i++){
if(i==0){
t[i]=1;
ll tmp=n-t[i];
if(t[i]>n) break;
//cout<<t[i-1]<<"***"<<tmp<<endl;
if(tmp%b==0){
puts("Yes");return ;
}
}
else{
t[i]=t[i-1]*a;
ll tmp=n-t[i];
if(t[i]>n) break;
//cout<<t[i-1]<<"***"<<tmp<<endl;
if(tmp%b==0){
puts("Yes");return ;
}
}
}
puts("No");
}
int main(){
int _=read;
while(_--){
solve();
}
return 0;
}
Strange Function
思路:
首先,(f(奇数)=2,f(偶数)>=2)
其次,(f(x)<=41),因为如果(f(x)=y),那么(lcm(1,2,3,……,y-1))一定是(x)的因子,而(lcm(1,2,3,……,y))一定不是(x)的因子,(lcm(1,2,3,……,41)>max(n)).
然后,考虑每个数对答案的贡献,也就是说(f(x)=y)的数有几个。
由于对于(f(x)>=2),假设答案最开始为(2*n);
再从(3)开始考虑每个数(y)对答案的贡献,(f(x)>=y)的个数为(n/lcm(1,2,3……y-1)),每次的贡献是(1)。因为每个都会被小于他的加一遍。
代码:
ll n,a[50];
ll gcd(ll a,ll b){
return b==0?a:gcd(b,a%b);
}
ll lcm(ll a,ll b){
return a/gcd(a,b)*b;
}
void init(){
a[1]=1;
for(int i=2;i<=42;i++)
a[i]=lcm(i,a[i-1]);
}
void solve(){
ll n=read;
ll res=2*n%mod;
rep(i,3,41){
res=(res+n/a[i-1])%mod;
}
cout<<res<<endl;
}
int main(){
init();
int _=read;
while(_--){
solve();
}
return 0;
}