第13屆景馳-埃森哲杯廣東工業大學ACM程序設計大賽 F 等式(求因子個數)

鏈接:https://www.nowcoder.com/acm/contest/90/F
來源:牛客網

題目描述

給定n,求1/x + 1/y = 1/n (x<=y)的解數。(x、y、n均爲正整數)

輸入描述:

在第一行輸入一個正整數T。
接下來有T行,每行輸入一個正整數n,請求出符合該方程要求的解數。
(1<=n<=1e9)

輸出描述:

輸出符合該方程要求的解數。

輸入

3
1
20180101
1000000000

輸出

1
5
181

解 :易得 x=n*y/(y-n)  設 y=y1+n; 則 x=n*n/y1 +n   因爲 n,x,y1都爲整數則y1是n*n的因子

那麼問題變成了求n^2的因子個數,比如 n=4 ,n*n=16;

y1     y      x     

1      5      20

2      6      12

4     8      8

8     12    6

16   20    5

顯然 答案爲ans=((n^2)的因子數+1)/2;

設 p1^a1 *p2^a2 * ..*pn ^ an=n

那麼 (a1+1)*(a2+1)*..*(an+1)爲n的因子數

顯然 n*n的因子數爲 (2*a1+1)*(2*a2+1)*..*(2*an+1)

#include<cstdio>
using namespace std;
int main()
{
    int T,N;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&N);
        //求N*N的因數 
        int ans=1;
        for(int i=2;i*i<=N;i++)
        {
            int temp=0;
            while(N%i==0)
            {
                temp++;
                N/=i;
            }
            ans*=(temp*2+1);
        }
        if(N>1) ans*=3;//剩下一個大素數,則N^2有兩個大素數,所以ans*(2+1) 
        printf("%d\n",(ans+1)/2);
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章