問題はこちら
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