做的第一个素数筛题,两天终于过了.........
思路:开一个大数组保存每个数的最小素因子,因子数f(N)就是所有素因子的次数加1相乘
N=p1^x1 + p2^x2 + .... + pk^xk;
则 f(N)=(x1+1)*(x2+1)*.....*(xk+1);
测试数据很多,用cin,cout会超时,所以用scanf,printf输出.........
#include <cstdio>
using namespace std;
int n,mins[1000001];
void findmins(){
mins[0]=1;
mins[1]=1;
for(int i=2;i<=1000000;i+=2)
mins[i]=2;
for(int i=3;i<1001;i++)
{
if(mins[i]==0)
{
mins[i]=i;
for(int j=i*i;j<=1000000;j+=i)
if(mins[j]==0)
mins[j]=i;
}
}
for(int i=2;i<=1000000;i++)
if(mins[i]==0)
mins[i]=i;
}
int main()
{
findmins();
while(scanf("%d",&n)!=EOF)
{
int ans=1;
int t=n;
while(t>1)
{
int count=1;
int k=mins[t];
while(t%k==0)
{
t/=k;
count++;
}
ans*=count;
}
printf("%d %d\n",ans-1,n/mins[n]);
}
return 0;
}