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