<del>
</del>
/
*1/x+1/y=1/n
给你一个整数n,求x,y组合的个数(n<=10^9)
式中有x,y两个变量,通过转化可以可以转化为一个条件
假设y=n+m;则x的表达式为x=n*n/m+n;
这个条件就是if(n*n%m==0)
所以答案就是n*n的因子个数
显然一般方法直接会超时的
但是n的素因子很少 最大是sqrt(n);
每个数都可以表示成素因子之积
n=(prime[0]^ans[0])*((prime[1]^ans[1])*....
知道了每个素因子的个数,n的其他非素因子可以由素因子组合而来
所以sum=(1+ans[0])*(1+ans[1])...//,这个类似母函数的组合形式,1表示不用,我们只要他的系数
因为n*n=((prime[0]^(ans[0]*2))*((prime[1]^(ans[1]*2))*....
sum=(1+ans[0]*2)*(1+ans[1]*2)....*/
假设y=n+m;则x的表达式为x=n*n/m+n;
所以答案就是n*n的因子个数
显然直接会超时的
但是n的素因子很少最多有sqrt(n);
每个数都可以表示成素因子之积
n=(prime[0]^ans[0])*((prime[1]^ans[1])*....
知道了每个素因子的个数
1表示不用 所以sum=(1+ans[0])*(1+ans[1])...
因为n*n=((prime[0]^(ans[0]*2))*((prime[1]^(ans[1]*2))*....
sum=(1+ans[0]*2)*(1+ans[1]*2)....*/
#include<stdio.h>
#include<string.h>
#define ll __int64
#define N 330000//最大的素因子为sqrt(n)
bool used[N];
int prime[N];
int cnt;
void init()
{
memset(used,false,sizeof(used));
for(int i=2;i<N;i++)
{
if(!used[i])
{
prime[cnt++]=i; //筛选素因子
for(int j=i;j<N;j+=i)
{
used[j]=true;
}
}
}
}
int main()
{
int T,k=1;
cnt=0;
init();
scanf("%d",&T);
while(T--)
{
ll n,sum=1;
scanf("%I64d",&n);
for(int i=0;i<cnt;i++)
{
ll ans=0;
if(prime[i]>n)
break;
while(n%prime[i]==0)
{
ans++;
n/=prime[i];
}
sum=(2*ans+1)*sum;
}
if(n>1)//n本身是素数的话
sum*=3;
printf("Scenario #%d:\n",k++);
printf("%I64d\n\n",sum/2+1);
}
return 0;
}