問題はこちら
No.358 も~っと!門松列 - yukicoder
p>max(A[i])に対して、A[i]はmod pで不変なので、A[i]が元から門松列なら無限個、そうでないならA[i] mod pが門松列になるようなものはp≦max(A[i])の時に限り、特に有限個となる。
max(A[i])≦1000なので、実際に3~1000まで試してみれば良い
int iskad(int a,int b,int c){ if((a!=c)&&((b<a&&b<c)||(b>a&&b>c)))return 1; return 0; } int main(){ int a1,a2,a3,i,s=0; scanf("%d%d%d",&a1,&a2,&a3); if(iskad(a1,a2,a3)){puts("INF");return 0;} for(i=3;i<=1000;i++)s+=iskad(a1%i,a2%i,a3%i); printf("%d",s); return 0; }
INFを最初に場合分けしなくてもどうにかしたい
もし答えがINFで無いならその値は998未満になっているはず(実際には「499 684 998」の920が最大)
剰余として1000より大きな値を考えることにすると、もともと門松列になっているか否かで決まるので、次のようなことが考えられる
int iskad(int a,int b,int c){ if((a!=c)&&((b<a&&b<c)||(b>a&&b>c)))return 1; return 0; } int main(){ int a1,a2,a3,i,s=0; scanf("%d%d%d",&a1,&a2,&a3); for(i=3;i<=2000;i++)s+=iskad(a1%i,a2%i,a3%i); if(s>=1000)puts("INF"); else printf("%d",s); //INFならi=1001~2000の分で必ず1000以上になっている //逆に、そうでないなら必ず998未満になっている return 0; }
ということでこの方針で縮めて
b,c,i,s; main(a){ for(scanf("%d%d%d",&a,&b,&c);i++<2e3;s+=(a-c)%i&&(a%i-b%i)*(c%i-b%i)>0); s=!printf(s<1e3?"%d":"INF",s); }
119B