メモ

yukicoderでゆるふわgolf

yukicoder No.64 XORフィボナッチ数列

問題はこちら
No.64 XORフィボナッチ数列 - yukicoder

xorを表す記号を\oplusとする。
a\oplus b=b\oplus a\\
(a\oplus b)\oplus c=a\oplus(b\oplus c)\\
a \oplus b \oplus b =a
が成立する事に注意すると、
F_2=F_1\oplus F_0\\
F_3=F_2\oplus F_1=(F_1 \oplus F_0)\oplus F_1=F_0\\
F_4=F_3\oplus F_2=F_0\oplus(F_1 \oplus F_0)=F_1
となるから、結局
F_{n+3}=F_n
となることが分かる。つまり、nの3での剰余について場合分けすればよい。

long a,b,n;
main(){
	scanf("%ld%ld%ld",&a,&b,&n);
	if(n%3==0)printf("%ld",a);
	if(n%3==1)printf("%ld",b);
	if(n%3==2)printf("%ld",a^b);
	return 0;
}

n%3で0とそれ以外の区別はつくが、1と2の区別は~n%3でつけることができるので

long a,b,n;
main(){
	scanf("%ld%ld%ld",&a,&b,&n);
	n=!printf("%ld",n%3?~n%3?b:a^b:a);
}

81B