唯一分解定理求和

暴力了一点

#include<iostream>
using namespace std;
const int maxn=1e6+10;
int vis[maxn];
int prime[maxn];
int tot=0;
void findprime(int n)
{
    for(int i=2;i<=n;i++)
    {
        if(vis[i]==0) prime[++tot]=i;
        for(int j=1;j<=tot&&i*prime[j]<=n;j++)
        {
            vis[i*prime[j]]=1;
            if(i%prime[j]==0) break;
        }
    }
}
int main()
{
    int n=1e6+10;
    findprime(n);
    int T; cin>>T;
    while(T--)
    {
        int n; cin>>n;
        int ans=1;
        for(int i=1;i<=tot && n!=1 ;i++)
        {
            if(n%prime[i]==0)
            {
                int c=1; n=n/prime[i];
                while(n%prime[i]==0) {c++, n=n/prime[i]; }
                int t=1;
                int x=prime[i];
                for(int k=1;k<=c;k++)
                {
                    t+=x;
                    x=x*prime[i];
                }
                ans*=t;
            }

        }
        if(n) ans*=n;
        cout<<ans<<endl;
    }

}
原文地址:https://www.cnblogs.com/Andromeda-Galaxy/p/9821628.html