Given n the number of solutions to 1/n=1/x+1/y (n,x,y=1,2,3...),

#include <bits/stdc++.h>
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<int> 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;
}

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324400178&siteId=291194637