等式
题目链接: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 }
“这些年我一直提醒自己一件事情,千万不要自己感动自己。大部分人看似的努力,不过是愚蠢导致的。什么熬夜看书到天亮,连续几天只睡几小时,多久没放假了,如果这些东西也值得夸耀,那么富士康流水线上任何一个人都比你努力多了。人难免天生有自怜的情绪,唯有时刻保持清醒,才能看清真正的价值在哪里。”