1. 程式人生 > >51nod 1082 與7無關的數 (打表預處理)

51nod 1082 與7無關的數 (打表預處理)

dao 空間 put ini spa 取消 memset blog ref

1082 與7無關的數技術分享 題目來源: 有道難題 基準時間限制:1 秒 空間限制:131072 KB 分值: 5 難度:1級算法題 技術分享 收藏 技術分享 關註 技術分享 取消關註 一個正整數,如果它能被7整除,或者它的十進制表示法中某個位數上的數字為7,則稱其為與7相關的數。求所有小於等於N的與7無關的正整數的平方和。 例如:N = 8,<= 8與7無關的數包括:1 2 3 4 5 6 8,平方和為:155。 Input
第1行:一個數T,表示後面用作輸入測試的數的數量。(1 <= T <= 1000)
第2 - T + 1行:每行1個數N。(1 <= N <= 10^6)
Output
共T行,每行一個數,對應T個測試的計算結果。
Input示例
5
4
5
6
7
8
Output示例
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 }
View Code

 

51nod 1082 與7無關的數 (打表預處理)