题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1299
题目大意:就是给你一个n,求1/x+//y=1/n正整数解的个数。
思路:首先我们可以在两边同时乘以xyn得yn+xn=xy,然后因式分解的(x-n)*(y-n)=n*n。这题要求解的个数,就变成了求n*n的因子数,网上很多人都是令y=n+k,然后的x=(n*n)/k+n,这儿也是求n*n的因子数。
通过数论的中的学习我们知道任意一个数n都可以由素数表示出来,即:
n=p1^e1*p2^e2*p3*e3*......pn^en 。(p1,p2,p3......pn都为素数)
因子数为:(1+e1)*(1+e2)*(1+e3)*......*(1+en) 所以对 n*n
n*n=p1^2e1*p2^2e2*p3^2e3......pn^2en
因子数为:(1+2*e1)*(1*2*e2)*(1+2*e3)*......*(1+2*en)
所以我们只需要求求出n的素因子。
code:
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
int vis[40005];
int prime[40005];
int primetable()
{
//int m=sqrt(40000+0.5);
int c=0;
memset(vis,0,sizeof(vis));
for(int i=2;i<=40000;i++)
{
if(!vis[i])
{
prime[c++]=i;
for(int j=i*i;j<=40000;j+=i)
{
vis[j]=1;
}
}
}
return c;
}
int main()
{
int i,kk=0;
int len,T,n,cnt,sum1;
len=primetable();
scanf("%d",&T);
while(T--)
{
kk++;
cnt=1;
scanf("%d",&n);
for(i=0;i<len;i++) //计算素因子的个数
{
int m=sqrt(n)+1;
if(prime[i]>m) break;
int sum1=0;
while(n%prime[i]==0)
{
sum1++;
n=n/prime[i];
}
cnt*=(1+2*sum1);
}
if(n>1) cnt*=3; //为什么这儿要乘以3,因为前面我们一直在做n/prime[i],但是做到最后不一定n==1,但是这时这个数却不能再被分解啦,所以这个数一定是一个素数,所以要做cnt*(1+2*1)
printf("Scenario #%d:\n%d\n\n",kk,(cnt+1)/2); //x与y交换只能算一种,所以要除以2,但是n也是因子之一啊,我们必须加上它做成两个它,再除以二就是了
}
return 0;
}