求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;
}
上一篇: 记一道c二级题目
下一篇: Python计算机二级考试备考(一)