4 6 7 5 4
对i的因子和打表居然还会TLE
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long LL;
const LL MAXN=100000+5;
LL f[MAXN],data1[MAXN],data2[MAXN],cnt;
LL d[MAXN];
LL prime[MAXN];
bool check[MAXN];
void Init_2()
{
LL tot=0;
memset(check,false,sizeof(check));
for(LL i=2;i<=MAXN;i++)
{
if(!check[i])
{
prime[tot++]=i;
}
for(LL j=0;j<tot&&i*prime[j]<MAXN;j++)
{
check[i*prime[j]]=true;
if(i%prime[j]==0)
break;
}
}
}
LL quick_pow(LL a,LL b)
{
LL c=1;
while(b)
{
if(b&1)
c=a*c;
a=a*a;
b>>=1;
}
return c;
}
LL sum(LL n)
{
LL a,b;
LL s=1;
for(LL i=0;prime[i]*prime[i]<=n;i++)
{
if(n%prime[i]==0)
{
a=prime[i];
b=0;
while(n%prime[i]==0)
{
n=n/prime[i];
b++;
}
//cout<<a<<" "<<b<<endl;
s*=(quick_pow(a,b+1)-1)/(a-1);
}
}
if(n>1)
s*=(n+1);
//cout<<s<<endl;
return s;
}
int main()
{
int t;
Init_2();
LL n;
scanf("%d",&t);
while(t--)
{
scanf("%lld",&n);
f[1]=n-1;
printf("%lld ",f[1]);
for(LL i=2;i<=n;i++)
{
f[i]=f[i-1]+n-sum(i);
//cout<<sum(i)<<endl;
if(i!=n)
printf("%lld ",f[i]);
else
printf("%lld\n",f[i]);
}
}
return 0;
}
<br /><span id="_xhe_temp" width="0" height="0"><br /></span>