题意:
求方程1/x+1/y=1/n的解的个数 1/3+1/2 与1/2+1/3看作是一组解。
分析:
x,y地位是等价的,且都大于n.
1/x+1/y = 1/n 设y = n + k;
==>1/x + 1/(n+k)=1/n;
==>x = n^2/k + n;
因为x为整数,k就是n^2的约数。然后对其素因子分解就可以了
由于x,y可以相等,所以结果一定为奇数,去重后的结果为加1再除2.
任何一个正整数都可以表示成素数的x次方之积,所以本题就被转化成了求n ^2的素因子个数;
先把n分解得到 n = p1^e1 * p2^e2 * ......*pr^er 其中p是< n 的素数那么n 的素因子, 则n的因子个数 k = (e1 + 1) * (e2 + 1) * (e3 + 1)*......
所以:n ^2的因子数是k = (2*e1+1) * (2*e2+1)* (2*e3+1)......
代码:#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
int num[1000];
int pre[1000];
int fenjie(int n)
{
memset(num,0,sizeof(num));
int count=0,hehe;
for(int i=2;i*i<=n;i++)
{
if(n%i==0)
{
while(n%i==0)
{
num[count]++;
n=n/i;
}
count++;
}
}
hehe=1;
if(n>1)
{
num[count]=1;
for(int i=0;i<=count;i++)
{
hehe=hehe*(2*num[i]+1);
}
}
else
{
for(int i=0;i<=count-1;i++)
{
hehe=hehe*(2*num[i]+1);
}
}
return hehe;
}
int main()
{
int t,n,num;
while(cin>>t)
{
for(int i=1;i<=t;i++)
{
cin>>n;
fenjie(n);
num=fenjie(n);
printf("Scenario #%d:\n",i);
printf("%d\n",(num+1)/2);
printf("\n");
}
}
return 0;
}