プロジェクトオイラー問154

http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%20154
Problem 154 「パスカルのピラミッドの探査」 †
(x+y+z)^200000のうち係数が10^12になってるものの個数をこたえる。

200000=a+b+cとして
係数はA=200000!/(a!*b!*c!)
Aを素因数分解したとき2と5が両方とも12個以上あればその数は条件を満たす。
対称性を利用して少しだけ計算量下げます。

計算時間7秒。
1分ルールをまもれたか微妙なところです。

#include<list>
#include<iostream>
#include<stdio.h> 

const int LIMIT=200000;
int count2[LIMIT+1],count5[LIMIT+1];
int main(){
	
	for(int i=0;i<=LIMIT;i++){
		int n2=2;
		while(n2<=i){
			count2[i]+=i/n2;
			n2*=2;
		}
		int n5=5;
		while(n5<=i){
			count5[i]+=i/n5;
			n5*=5;
		}
	}
	__int64 ans=0;
	for(int i=0;i<=LIMIT/3;i++){
		for(int j=i;j+i<=LIMIT;j++){
			int k=LIMIT-i-j;
			if(k<j)break;
			int c2=count2[LIMIT]-count2[i]-count2[j]-count2[k];
			int c5=count5[LIMIT]-count5[i]-count5[j]-count5[k];
			if(c2<12||c5<12)continue;
			
			if((i<j)&&(j<k)){
				ans+=6;	
			}else{
				ans+=3;
			}
		}
	}
	std::cout<<"ans="<<ans<<"\n";
}
最終更新:2016年01月12日 03:50