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