给出n求1/n=1/x+1/y(n,x,y=1,2,3...)的解的个数,

#include using namespace std; /* 题意:给出n,求1/n=1/x+1/y(n,x,y=1,2,3...)的解的个数,找出最小的n,构成1/n的式子超过1000设x=n+a,y=n+b,化简可得n^2=a*b.设n^2的因子个数为p,n^2的所有因子中除n外都是成对出现的,故方程解数为(p+1)/2。 比如n=4,则x=8,y=8;x=20,y=5;x=12,y=6 一共有3种情况 一个数的约数必然包括1及其本身。 因为n <= 10^9,则n^2是一个很大的数,在时间和空间上都不允许直接操作,考虑到任何整数n都可以表示为 n = p1^e1*p2^e2*..pn^en,其中p1,p2..,pn都为素数, 并且n的约数个数为 (1+e1)*(1+e2)*...(1+en); 所以n^2 = (p1^e1*p2^e2...pn^en)^2 = p1^2e1*p2^2e2...*pn^2en,故其约数个数为(1+2e1)*(1+2e2)*...(1+2en); 所以只需求出n的约数个数即可,每次求出ek(k=1,2,3,4..)的时候,将结果乘上2即可。 //除不尽,说明n是大于sqrt(10^9)的素数,ret *= (1 + 2*1); 是正整数,则形如 n=p⑴^β⑴·p⑵^β*⑵·…·p(k)^β(k) 的数都是n的约数,其中β⑴可取a⑴+1个值:0,1,2,…,α⑴;β⑵可取α⑵+1个值:0,1,2,…,α⑵…;β(k)可取a(k)+1个值:0,1,2,…,α(k).且n的约数也都是上述形式,根据乘法原理,n的约数共有 (α⑴+1)(α⑵+1)…(α(k)+1) */int getCount(int n) { int p = 0; vector temp(1009,0); //for(int i = 2; i * i <= n; ++i) for(int i = 2; i <= n; ++i) { if(n%i == 0) { while(n % i == 0) { ++temp[p]; n /= i; } ++p; } } //if(n != 1) //除不尽,说明n是大于sqrt(10^9)的素数,ret *= (1 + 2*1); //{ //++temp[p]; //++p; //} for(int i = 0; i < p; ++i) temp[i] *= 2; int ans = 1; for(int i = 0; i < p; ++i) ans *= (temp[i] + 1); return (ans+1)/2; } int main() { int n; cin >> n; cout<< getCount(n) << endl; return 0; }

    推荐阅读