约数个数

#define N 1000001

bool vis[N];
int prime[N];

int t[N],e[N];

//    前n个约数个数之和 
void init()
{
    int cnt=0;
    t[1]=1;
    for(int i=2;i<=n;++i)
    {
        if(!vis[i])
        {
            prime[++cnt]=i;
            t[i]=2;
            e[i]=1;
        }
        for(int j=1;j<=cnt;++j)
        {
            if(i*prime[j]>n) break;
            vis[i*prime[j]]=true;
            if(i%prime[j]==0)
            {
                t[i*prime[j]]=t[i]/(e[i]+1)*(e[i]+2);
                e[i*prime[j]]=e[i]+1;
                break;
            }
            else 
            {
                t[i*prime[j]]=t[i]*2;
                e[i*prime[j]]=1;
            }
        }
    }
}

 

posted @ 2018-11-27 10:03  奋斗の小白  阅读(110)  评论(0编辑  收藏  举报