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

メモ

yukicoderで遊んでいる競プロゆるふわ勢

yukicoder No.290 1010

問題はこちら
No.290 1010 - yukicoder

問題名がヒントになっているうまい問題
問題文は要するに「繰り返しが登場するか」ということ
なのでもし同じ文字が2つ連続していればYES
同じ文字が連続しないなら、それは1010…か0101…という列になるので、N≧4なら「10」か「01」が繰り返されておりYES、N≦3ならNO

int main(){
	int n,i;
	char s[4];
	scanf("%d%3s",&n,s);
	if(n==1)puts("NO");
	if(n==2)puts(s[0]==s[1]?"YES":"NO");
	if(n==3)puts(s[0]==s[1]||s[1]==s[2]?"YES":"NO");
	if(n>=4)puts("YES");
	return 0;
}

どうせ3文字しかいらないのでint型変数に読み込んでしまおう
その後なんかいい感じに剰余とかbit演算とかで計算してうまくいかないかなあとプログラムを回した(かなり適当)

a[]={3158320,3223601,12592,12337,48,49},
//NOになるやつ
b[]={12336,12593,3158064,3223600,3223856,3158065,3158321,3223857};
//YESになるやつ
temp;
i,j,k,f,t,x;
int main(){
	for(i=99;i>=2;i--)for(j=i;j>=2;j--)for(x=j;x>=2;x--){
		temp=a[0]%i%j%x;
		//3回くらい剰余を取ればなんかいい感じにならないかなあ…
		f=1;
		for(k=1;k<6;k++){
			t=a[k]%i%j%x;
			if(temp!=t){f=0;break;}
		}
		for(k=0;k<8;k++){
			t=b[k]%i%j%x;
			if(temp==t){f=0;break;}
		}
		if(f)printf("%d %d %d %d\n",i,j,x,temp);
	}
}

期待はしてなかったけど実行してみるとただ1つだけ存在して「95 49 3 0」となった。
ということでこれにより次のように書くことができる

i;main(s){i=scanf("%d%3s",&i,&s)>puts(i>3|s%95%49%3?"YES":"NO");}

65B