欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

求N的因子和(1e12)

程序员文章站 2024-03-15 14:58:29
...

输入t组数据,每组一个n,(1<=n<=1e12)
大于根号N的质因子最多只可能有一个,所以只需要求出根号N及以前的分补乘积,如最后不为1,说明有大于根号N的质因子x,再用ans乘(x+1)即可

#include <bits/stdc++.h>

using namespace std;
const int maxx=1e6+50;
int ans[maxx];
int vis[maxx];
int flag=0;
void ss(int n);
long long __ans(long long x);
int ksm(int x,int n)
{
    int t;
    if(n==0)
        t=1;
    else
    {
        t=ksm(x*x,n/2);
        if(n&1)
            t*=x;
    }
    return t;
}
int main()
{
    int t;
    ss(1000010);
    scanf("%d",&t);
    long long x;
    while(t--)
    {
        scanf("%lld",&x);
        printf("%lld\n",__ans(x));
    }
    return 0;
}
void ss(int n)
{
    memset(vis,1,sizeof(vis));
    for(int i=2;i<=n;i++)
    {
        if(vis[i])
            ans[++flag]=i;
        for(int j=1;j<=flag&&i*ans[j]<=n;j++)
        {
            vis[i*ans[j]]=0;
            if(i%ans[j]==0)
                break;
        }
    }
}
long long __ans(long long x)
{
    long long all=1;
    long long before=x;
    for(int i=1;ans[i]<=sqrt(before*1.0);i++)
    {
        int t=1,j=1;
        while(x%ans[i]==0)
        {
            t+=ksm(ans[i],j);
            j++;
            x/=ans[i];
        }
        all*=t;
        if(x==1)
            break;
    }
    if(x!=1)
        all*=(1+x);
    return all;
}