题目链接:https://www.nowcoder.com/acm/contest/90/F
题目描述:
给定n,求1/x + 1/y = 1/n (x<=y)的解数。(x、y、n均为正整数)
知识点: 算术基本定理
解题思路:
(1/x + 1/y = 1/n)
(yn + xn - xy = 0)
(xy - xn - yn = 0)
((n-x)(n-y) - n^2 = 0)
(n^2 = (n-x)(n-y) )
问题至此就转变成问有多少个 ((n-x)) 和 ((n-y)) (((n-y) le (n-x))),满足上式,其实就是求 (n^2) 有多少个不大于 (n^2/2) 的因数。
设 (n^2) 的因数个数为 (x)
则答案等于 ((x+1)/2).
先分解出 (n) 的算术基本式,(n^2) 的每个质因子的次数就是 (n) 对应质因子次数的两倍,然后用算术基本定理求出 (x).
AC代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 1e5+5; 4 typedef long long ll; 5 int has[maxn]; 6 int main(){ 7 int n,T; 8 scanf("%d",&T); 9 while(T--){ 10 memset(has,0,sizeof(has)); 11 scanf("%d",&n); 12 int cnt=0; 13 for(int i=2;i*i<=n;i++){ 14 if(n%i==0){ 15 while(n%i==0){ 16 n/=i; 17 has[cnt]++; 18 } 19 cnt++; 20 } 21 if(n==1) break; 22 } 23 if(n!=1){ 24 has[cnt]=1; 25 cnt++; 26 } 27 ll ans=1; 28 for(int i=0;i<cnt;i++){ 29 ans*=(1+has[i]*2); 30 } 31 printf("%lld ",(ans+1)/2); 32 } 33 return 0; 34 }