标签:正整数 icon targe stream std 枚举 art names 它的
第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 1000)
第2 - T + 1行:每行1个数N。(1 <= N <= 10^6)
共T行,每行一个数,对应T个测试的计算结果。
5
4
5
6
7
8
30
55
91
91
155
和素数筛法有点类似,打表预处理与7有关的数并求出前缀和。然后调用前缀和数组。
注意数据溢出。
1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 const int maxn=1e6+10; 5 int n; 6 bool valid[maxn]; 7 long long sum[maxn]; 8 void init() 9 { 10 memset(valid,true,sizeof(valid)); 11 //能被7整除 12 for(int i=7;i<maxn;i+=7) 13 valid[i]=false; 14 //数位上含7 15 for(int i=1;i<maxn;i*=10)//枚举个位、十位、百位... 16 { 17 int tmp=i*10; 18 for(int j=i*7;j<maxn;j+=tmp) 19 for(int k=0;k<i;k++) 20 { 21 valid[j+k]=false; 22 } 23 } 24 sum[0]=0; 25 for(long long i=1;i<maxn;i++)//递推求前缀和 26 { 27 if(valid[i]) 28 sum[i]=sum[i-1]+i*i; 29 else 30 sum[i]=sum[i-1]; 31 } 32 } 33 int main() 34 { 35 int t; 36 cin>>t; 37 init(); 38 while(t--) 39 { 40 cin>>n; 41 cout<<sum[n]<<endl; 42 } 43 return 0; 44 }
标签:正整数 icon targe stream std 枚举 art names 它的
原文地址:http://www.cnblogs.com/onlyli/p/7253938.html