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

メモ

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

yukicoder No.358 も~っと!門松列

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