题目描述
给定n,求1/x + 1/y = 1/n (x<=y)的解数。(x、y、n均为正整数)
 
输入描述:
在第一行输入一个正整数T。 接下来有T行,每行输入一个正整数n,请求出符合该方程要求的解数。 (1<=n<=1e9)
输出描述:
输出符合该方程要求的解数。
  示例1 
 输入
3 1 20180101 1000000000
输出
1 5
181
1.先将等式通分化简 ,注意各值的取值范围2.可以得到 a * b = n * n ;即求n * n 的因子数,这里用到算术基本定理。(算术基本定理:一个大于1的正整数N,如果它的标准分解式为: ,那么它的正因数个数为 啦啦啦)因此利用短除法可以得到注意:(1<=n<=1e9) 所以在求n后 sum *= (1 + 2 * ai).....sum 求的a , b 是其因子数而一对a,b的值为一组解, 考虑到a = b 的情况所以最后的答案(sum + 1)/2;
#include <stdio.h>    int      main()    {             int      T , n;             scanf     (     "%d"      , &T);             while     (T--)             {                 scanf     (     "%d"      , &n);                 int      ans = 0;                 int      i = 2;                 int      sum = 1;                 int      flag = 0;                 if     (n == 1)                 {                     sum = 1;                 }                 else                 {                     flag = 1;                 }                 while     (n != 1)                 {                     while     (1)                     {                         if     (n % i == 0)                         {                             ans++;                             n = n / i;                         //  printf("ans = %d n = %d i = %d\n" , ans , n , i);                         }                         else                         {                             break     ;                         }                     }                                                  sum *= (1 + 2 *ans);     //注意我们要求的是n*n = a * b(n*n)的因子数 , 而此时是n,因此为(1 + 2 * ans)                         //  printf("sum = %d\n" , sum);                                              ans = 0 ;                         i++;                                  }                 printf     (     "%d\n"      , (sum + 1)/2 );     //sum + 1 的原因是 有当a == b 的时候,原先的sum求的是a , b的个数而一对a*b是一个解,                 //因此需要除以 2;             }             return      0;    }    
京公网安备 11010502036488号