题意:给出n,求1/n=1/x+1/y(n,x,y=1,2,3...)的解的个数
分析:n = (x*y)/(x+y)
(x+y)*n = x*y
设x = n+a; y = n+b
带入可以得到
n*n = a*b
题目就转化成了求所有整数对使得a*b = n*n。
即求n*n的约数个数,由于约数都是成对出现的,两数乘积为n^2,为奇数是因为n与n成对出现,而只计算了1次。为避免重复,设约数个数为p,(p + 1)/2即为所求。
然而n*n过大不能直接求约数。我们用求质因子的方法求约数个数,我们只需求n的素因子,每个个数乘2即为n*n的每个素因子个数。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#define MAX 40005
int prime[MAX];
int vis[MAX];
int idx;
void findPrime()
{
int i,j;
memset(vis,0,sizeof(vis));
idx=0;
for(i=2;i<=200;i++)
{
if(!vis[i])
{
for(j=i*i;j<=40000;j+=i)
{
vis[j]=1;
}
}
}
for(i=2;i<=40005;i++)
{
if(!vis[i])
{
prime[idx++]=i;
}
}
}
int cal(int n)
{
int ret=1;
int i,time;
for(i=0;i<idx&&prime[i]<=n;i++)
{
time=0;
while(n%prime[i]==0)
{
n/=prime[i];
time++;
}
ret*=(1+time*2);
}
if(n>1)
ret*=3;
return ret;
}
int main()
{
int Case;
int ca,n,ans;
findPrime();
scanf("%d",&Case);
for(ca=1;ca<=Case;ca++)
{
scanf("%d",&n);
ans=cal(n);
printf("Scenario #%d:\n",ca);
printf("%d\n\n",(ans+1)/2);
}
return 0;
}
4161

被折叠的 条评论
为什么被折叠?



