数据量太大所以不能用一般的方法求解。这里学的一个方法,先处理出根号下最大数据量的素数,即1e6内的素数。然后唯一分解,分解出一个就在答案上乘以这个数个数加一。这样就是所有的质因子排列组合成不同的因子,举例说明:12的质因子是2,2,3,那么答案就是2的个数+1乘以3的个数+1等于6。下面有个地方要处理下,就是如果分解完了不是1,说明这个数是大于1e6的素数。还有素数平方小于等于n是必须的优化。感觉还是不透彻,这些点先记下来,以后有什么感悟在写上来。
#include <iostream>
#include <cmath>
#include <vector>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=1e6+3;
int t,k,len;
long long int n;
int vis[maxn];
int prime[maxn];
void inition()
{
memset(vis,0,sizeof(vis));
for(int i=2;i<maxn;i++)
{
if(!vis[i])
{
for(int j=i*2;j<maxn;j+=i)
vis[j]=1;
prime[len++]=i;
}
}
}
int main()
{
inition();
scanf("%d",&t);
while(t--)
{
scanf("%lld",&n);
long long int ans=1;
for(int i=0;i<len && prime[i]*prime[i]<=n;i++)
{
int num=0;
while(n%prime[i]==0)
{
num++;
n/=prime[i];
}
ans*=num+1;
if(n==1) break;
}
if(n>1) ans*=2;
printf("Case %d: %lld\n",++k,ans-1);
}
return 0;
}