一个正整数,如果它能被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
#include<iostream>
#include<math.h>
#include<string>
#include<string.h>
using namespace std;
const int maxx=1e6+7;
__int64 sum[maxx];
bool flag[maxx];//判断是不是与7相关数
void init()
{
memset(flag,false,sizeof(flag));
for(int i=7; i<maxx; i+=7)//7的倍数
flag[i]=true;
int ra;
for(int i=1; i<maxx; i*=10)//数位含有7
{
ra=i*10;//表示最高位
for(int j=7*i; j<maxx; j+=ra){//j表示次高位 然后每次加都是最高位加1
for(int k=0; k<i; k++){//表是比j低的位数
flag[k+j]=true;
}
}
}
}
void solve(){
for(long long j=2; j<maxx; j++){//要考虑j是否越界所以用long long 不然无法通过
if(!flag[j]){
sum[j]=sum[j-1]+j*j;
}
else
sum[j]=sum[j-1];
}
}
int main()
{
int t;
cin>>t;
int num;
init();//判断是不是与7相关
sum[0]=0;
sum[1]=1;
solve();//打表
while(t--){
cin>>num;
cout<<sum[num]<<endl;
}
return 0;
}