CF1542A~C

传送门

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;
}
 
原文地址:https://www.cnblogs.com/OvOq/p/15021766.html