啥都不会啊!怎么办啊!

Fitz

慢慢来生活总会好起来的!!!

给定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 }

 

 
posted @ 2018-03-25 21:40  Fitz~  阅读(3339)  评论(0编辑  收藏  举报