题目描述
给定n(2≤n≤10^9)值,要求x、y均为正整数,且 x < y,并且满足1/x+1/y=1/n. 编程统计有多少对这样的x和y。
输入格式
一个整数n。
输出格式
一个整数,表示相应的方法数是多少。
第一步化简式子嘛, n( x+y ) = xy,反正看到这里我是什么冲动都没有,但是题解很巧妙:两边同时加上 n^2再移项,得 n^2 = n^2 - n( x+y ) + xy ;这次熟悉一点了,因式分解得, n^2 = ( n-x )( n-y )。这意味着什么呢?n-x 为 n^2 的一个因子,而 n 是固定的,也就是说,每一种 n^2 = ab (a < b) 的因数拆解方式都对应了一组 x,y 的取值。我们并不在意 x,y 具体是多少。那么直接开搞就可以了。
另外,这里求约数个数要用到算术基本定理的推论:
定理性的证明之后有空整理出来单写。
细节见code:
#include<bits/stdc++.h>
using namespace std;
int k;
int ans;
int pri_[10000];
int cnt;
inline void read(int &x)
{
x=0;int f=1;char s=getchar();
for(;s<'0'||s>'9';s=getchar()) if(s=='-') f=-1;
for(;s>='0'&&s<='9';s=getchar()) x=(x<<3)+(x<<1)+s-48;
}
void divide_()
{
memset(pri_,0,sizeof(pri_));
cnt=0;
for(int i=2;i*i<=k;++i)
if(!(k%i)){
++cnt;
while(!(k%i)) k/=i,++pri_[cnt];
}
if(k!=1) pri_[++cnt]=1;
}
int main()
{
read(k);
divide_();//预处理出n的质因子表达式。
ans=1;
for(int i=1;i<=cnt;++i) ans*=(pri_[i]*2+1);//因为要用n^2的质因子表达式,所以每个质因子指数都乘以二。
printf("%d",ans>>1);//n^2=ab;n^2=ba;两者重复计算了,故除以二。n^2=n*n,但是x,y不允许相同,(n-a),(n-b)也不能相同,这种情况不可取,但是不要紧,我们向下取整了。
return 0;
}
=o=