等式

题目链接: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 }

  

“这些年我一直提醒自己一件事情,千万不要自己感动自己。大部分人看似的努力,不过是愚蠢导致的。什么熬夜看书到天亮,连续几天只睡几小时,多久没放假了,如果这些东西也值得夸耀,那么富士康流水线上任何一个人都比你努力多了。人难免天生有自怜的情绪,唯有时刻保持清醒,才能看清真正的价值在哪里。”
原文地址:https://www.cnblogs.com/Blogggggg/p/8645707.html