パスカルの三角形の10億段目までに7で割り切れない数はいくつあるか答える問題。
とりあえず素朴に一行単位でまとめて計算。
計算時間3分。
#include<stdio.h>
#include<vector>
#include<iostream>
const int LIMIT=10000*10000*10;
int main(){
__int64 n7=7;
__int64 ans=0;
std::vector<__int64> vec,vec7,vec7_2;
vec.push_back(0);
vec7.push_back(6);
vec7_2.push_back(6);
for(int i=1;i<=LIMIT;i++){
int m=1;
int dell=0;
for(int j=vec.size()-1;j>=0;j--){
dell+=(vec[j]*m*vec7[j]);
m*=(vec[j]+1);
}
ans+=(i-dell);
for(int j=0;j<vec7.size();j++){
vec7[j]--;
}
for(int j=0;j<vec.size();j++){
if(vec7[j]==-1){
if(j==0)vec[j]++;
vec7[j]=vec7_2[j];
if(vec[j]==7){
vec[j]=0;
if(vec.size()<=j+1){
n7*=7;
vec.push_back(1);
vec7_2.push_back(n7-1);
vec7.push_back(n7-1);
break;
}else{
vec[j+1]++;
}
}
}
}
}
std::cout<<"ans="<<ans<<"\n";
}
最終更新:2015年12月15日 01:20