読者です 読者をやめる 読者になる 読者になる

Codeforces Round #257 (Div1)

Codeforces

たまにはCFもやります。

D:
自明やるだけ

#include<stdio.h>
#include<algorithm>
using namespace std;
int a[1100000];
long long pow2[1100000];
int b[1<<20];
int main(){
	int mod=1000000007;
	int n;scanf("%d",&n);
	pow2[0]=1;
	for(int i=1;i<1100000;i++)pow2[i]=pow2[i-1]*2%mod;
	for(int i=0;i<n;i++)scanf("%d",a+i);
	std::sort(a,a+n);
	for(int i=0;i<n;i++)b[a[i]]++;
	for(int i=0;i<20;i++){
		for(int j=0;j<(1<<20);j++)
			if(0==(j&(1<<i)))b[j]+=b[j|(1<<i)];
	}
//	for(int i=0;i<(1<<20);i++)
	//	if()
	long long ret=0;
	for(int i=0;i<(1<<20);i++){
		int count=0;
		for(int j=0;j<20;j++)if(i&(1<<j))count++;
		if(count%2==0)ret=(ret+pow2[b[i]])%mod;
		else ret=(ret+mod-pow2[b[i]])%mod;
	}
	printf("%d\n",(int)ret);
}

C:
やるだけでも間に合う。

#include<stdio.h>
#include<algorithm>
using namespace std;
int prime[110000];
int aite[110000];
int use[110000];
int A[110000];
int B[110000];
int gcd(int a,int b){
	while(a){
		b%=a;
		int c=a;a=b;b=c;
	}return b;
}
int main(){
	int a;scanf("%d",&a);
	prime[0]=prime[1]=-1;
	for(int i=2;i<110000;i++){
		if(~prime[i]){
			prime[i]=1;
			for(int j=i+i;j<110000;j+=i)prime[j]=-1;
		}
	}
	use[1]=1;aite[1]=1;
	int rem=-1;
	for(int i=2;i<=a;i++){
		if(~prime[i]){
			;
		}else{
			if(i%2==0&&~prime[i/2]){
				use[i]=use[i/2]=1;
				aite[i]=i/2;
				aite[i/2]=i;
			}else if(!~rem){
				rem=i;
			}else{
				int at=-1;
				for(int j=2;j<i;j++){
					if(use[j]&&rem!=j){
						if(gcd(j,i)!=1&&gcd(aite[j],rem)!=1){
							use[i]=use[rem]=1;
							aite[i]=j;aite[rem]=aite[j];aite[aite[j]]=rem;aite[j]=i;
							rem=-1;
							at=j;
							break;
						}
						if(gcd(j,rem)!=1&&gcd(aite[j],i)!=1){
							use[i]=use[rem]=1;
							aite[i]=aite[j];aite[rem]=j;aite[aite[j]]=i;aite[j]=rem;
							rem=-1;
							at=j;
							break;
						}
					}
				}
			//	if(at==-1){
			//		printf("dame\n");return 0;
			//	}
			}
		}
	}
	int ret=0;
	for(int i=2;i<=a;i++){
		if(use[i]){
			A[ret]=i;
			B[ret]=aite[i];
			use[i]=use[aite[i]]=0;
			ret++;
		}
	}printf("%d\n",ret);
	for(int i=0;i<ret;i++)printf("%d %d\n",A[i],B[i]);
}

A:
無理ゲー

B:
無理ゲー

E:
無理ゲー

Hack:
無理ゲー

System Test:
無理ゲー

Rating:
無理ゲー
2164 -> 2279 (+115)

なんだかんだ言ってCFも赤まで来てしまったなあ。安定は難しいらしいけど。