メモ

yukicoderでゆるふわgolf

yukicoder No.682 Average

問題はこちら
No.682 Average - yukicoder

(A+B+i)/3が整数⇔A+B+iが3の倍数 を使って全探索するだけ

main(){
	int a,b;
	scanf("%d%d",&a,&b);
	int ans=0;
	for(int i=a;i<=b;i++)if((a+b+i)%3==0)ans++;
	printf("%d",ans);
}

「A≦i≦BのうちA+B+iが3の倍数になるようなiの個数」は「A+B+A以上A+B+B以下の3の倍数の個数」なので
(A+B+B)/3-(A+B+A-1)/3により求めることができる。

しかし実はさらに短い計算式が存在する。
答えがA%3,B%3,(B-A)/3のみに依存していることは容易に想像できるので、場合分けをしてみる。n=(B-A)/3とおく

A%3 B%3 答え
0 0 n+1
0 1 n
0 2 n+1
1 0 n+1
1 1 n+1
1 2 n
2 0 n
2 1 n+1
2 2 n+1

表をぐっと睨むと、答えは
(B-A)%3が1のときn、それ以外のときn+1になっていることがわかる
ということで(B-A)/3+((B-A)%3!=1)で計算できる。
この式を睨んで次のように短縮する

main(a,b){
	scanf("%d%d",&a,&b);
	printf("%d",(b-=a)/3+1-b%3%2);
}

61B