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;
}
 
posted @ 2021-07-16 20:44  OvO1  阅读(45)  评论(0编辑  收藏  举报