nefu1315BD的难题2

BD的难题2

Problem:1315

Time Limit:1000ms

Memory Limit:65535K

Description


给定一个n,求如下公式:


然后输出 f(1), f(2)...f(n)

Input


输入一个正整数T(T<=10),表示有T组数据,对于每组数据输入一个n(n<=100000)

Output


输出f(1),f(2)...f(n)结果

Sample Input


1
5

Sample Output


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>

猜你喜欢

转载自blog.csdn.net/qq_38144740/article/details/79183365
BD