51nod 1082 與7無關的數 (打表預處理)
阿新 • • 發佈:2017-07-29
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,sizeofView Code(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 }
51nod 1082 與7無關的數 (打表預處理)