题目大意:给定n,求满足1/n = 1/x + 1/y的整数对的个数(x和y互换算一种)。
分析:可令x<=y。1/n = 1/x + 1/y,1/n = (x+y) / xy,n=xy / (x+y),(x+y)*n = xy,有公式可以看出,x和y必定大于n,所以令x=n+a,y=n+b,带入可得:n ^ 2 = ab。这样就转换成了求n ^ 2的因子个数。
当ans为偶数时,答案为ans/2;当ans为奇数时,答案为ans/2+1。
所以答案为(ans + 1) / 2。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=4e4+5;
bool p[N];
int prime[N],cnt=0;
void isprime()//欧拉筛
{
memset(p,0,sizeof p);
p[0]=p[1]=1;
for(int i=2;i<N;i++)
{
if(!p[i]) prime[cnt++]=i;
for(int j=0;j<cnt&&(ll)i*prime[j]<N;j++)
{
p[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
}
int main()
{
isprime();
int t,n,cas=1;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
ll ans=1,res;//ans:因子个数
for(int i=0;i<cnt;i++)
{
if(n==1) break;
res=0;
while(n%prime[i]==0)
{
res++; //res:prime[j]的指数
n/=prime[i];
}
ans*=2*res+1;
}
if(n!=1) ans*=3;//ans*=2*1+1
printf("Scenario #%d:\n",cas++);
printf("%lld\n\n",(ans+1)/2);
}
return 0;
}