メモ

yukicoderでゆるふわgolf

yukicoder No.500 階乗電卓

問題はこちら
No.500 階乗電卓 - yukicoder

N≧50以上のとき、N!は2,5の素因数をそれぞれ12個以上もつのでN! mod 10^12=0
それ以下のときだけ計算すれば良い
14!<10^12<15!なので、Nが15以上のときには先頭を0埋めする

long s=1,n;
main(){
	scanf("%ld",&n);
	if(n>=50){
		puts("000000000000");
	}else{
		for(int i=1;i<=n;i++)s=s*i%1000000000000;
		printf(n>=15?"%012ld":"%ld",s);
	}
}

条件分岐の順番をちょっと考えていい感じにまとめる

long s=1,n,M=1e12;
main(i){
	for(scanf("%ld",&n);n%51/i;s=s*i++%M);
	printf(n<15?"%ld":"%012ld",i<n?0:s);
}

101B


2017/07/28追記
だいぶ頭が悪かったみたいですね

long s=1,n,M=1e12;
main(i){
	for(scanf("%ld",&n);n/i*50/i;s=s*i++%M);
	printf(n<15?"%ld":"%012ld",s);
}

97B