等式

题目链接: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\n",(ans+1)/2);
32     }
33     return 0;
34 }

 

  

posted @ 2018-03-25 17:54  Blogggggg  阅读(208)  评论(0编辑  收藏  举报