給定n,求1/x + 1/y = 1/n (x<=y)的解數~hdu-1299~(分解素因子詳解)


鏈接: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)

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

這題是我在牛客比賽時候遇到的一題,表示根本不會啊!
靠大佬點撥才能把問題轉化為分解素因子。

第一步先要因式分解 y=(x*n)/(x-n); 設(x-n)=a;
y=(n*(a+n))/(a);
y=n+(n*n)/a;
問題終於轉為為了求n^2的素因子
n^2的素因子是n的素因子數目的兩倍 ,這個非常的顯然。
還有一個步驟一個數的因子數為(每一個素因子的數目+1)相乘所得
例如15的因子數目為1,3,5 ,15 (1+1)*(1+1)=4;
還有最后一個小細節 ,一個數大於sqrt(n)素因子最多有且只有一個
因為求的是n^2的因數 所以 (2*1+1)=3;
才會有最后一句 if(n>1)  ans*=3;


菜是原罪!!!
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 using namespace std;
 7 
 8 
 9 int main() {
10     int t;
11     scanf("%d",&t);
12     while(t--) {
13         int n,ans=1,m,temp=0;
14         scanf("%d",&n);
15         m=(int)sqrt(n);
16         for(int i=2; i<=m; i++) {
17             if(n%i==0) {
18                 while(n%i==0) {
19                     n=n/i;
20                     temp++;
21                 }
22                 ans=ans*(temp*2+1);
23                 temp=0;
24             }
25         }
26         if(n>1)  ans*=3;
27         printf("%d\n",ans/2+1);
28     }
29     return 0;
30 }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM