鱼C论坛

 找回密码
 立即注册
查看: 2761|回复: 1

题目157:7求解丢番图方程1/a+1/b= p/10^n

[复制链接]
发表于 2016-9-13 15:35:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 欧拉计划 于 2016-9-14 15:53 编辑
Solving the diophantine equation 1/a+1/b= p/10n

Consider the diophantine equation 1/a+1/b= p/10n with a, b, p, n positive integers and a ≤ b.

For n=1 this equation has 20 solutions that are listed below:

QQ20160914-1@2x.png

How many solutions has this equation for 1 ≤ n ≤ 9?


题目:

考虑丢番图方程 1/a+1/b= p/10n ,a, b, p, n 都是正数,并且 a ≤ b

对于 n=1,则该方程有下面二十个解:

1/1+1/1=20/10            1/1+1/2=15/10           1/1+1/5=12/10            1/1+1/10=11/10            1/2+1/2=10/10
1/2+1/5=7/10              1/2+1/10=6/10            1/3+1/6=5/10            1/3+1/15=4/10              1/4+1/4=5/10
1/4+1/20=3/10             1/5+1/5=4/10           1/5+1/10=3/10            1/6+1/30=2/10              1/10+1/10=2/10
1/11+1/110=1/10         1/12+1/60=1/10          1/14+1/35=1/10          1/15+1/30=1/10          1/20+1/20=1/10

请问,对于 1 ≤ n ≤ 9,该方程有多少个解?

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-9-21 21:26:01 | 显示全部楼层
本帖最后由 guosl 于 2022-9-22 10:36 编辑

先将p设为1,则原方程化为1/a + 1/b = 1/10^n。令m=10^n,a=m+x,b=m+y。则方程可以化为xy=m^2。对m^2进行因数分解可以求解,如果a,b有公因数p>1,则这个解可以化成1/a+1/b=p/10^n的解。
  1. /*
  2. 答案:53490
  3. */
  4. #include <iostream>
  5. #include <cmath>
  6. using namespace std;

  7. const int N = 9;

  8. unsigned long long mpow(int n, int m)
  9. {
  10.   unsigned long long p = 1;
  11.   for (int i = 0; i < n; ++i)
  12.     p *= 2;
  13.   for (int i = 0; i < m; ++i)
  14.     p *= 5;
  15.   return p;
  16. }

  17. unsigned long long gcd(unsigned long long x, unsigned long long y)
  18. {
  19.   if (y == 0)
  20.     return x;
  21.   unsigned long long z = x % y;
  22.   while (z != 0)
  23.   {
  24.     x = y;
  25.     y = z;
  26.     z = x % y;
  27.   }
  28.   return y;
  29. }

  30. unsigned long long getmp(unsigned long long k)
  31. {
  32.   if ((k % 2) == 0)
  33.     return 2;
  34.   unsigned long long u = (unsigned long long)sqrt((double)k);
  35.   for (unsigned long long i = 3; i <= u; i += 2)
  36.   {
  37.     if (k % i == 0)
  38.       return i;
  39.   }
  40.   return k;
  41. }

  42. int getdc(unsigned long long d)
  43. {
  44.   int nC = 1;
  45.   while (d != 1)
  46.   {
  47.     unsigned long long p = getmp(d);
  48.     int k = 0;
  49.     while (d % p == 0)
  50.     {
  51.       ++k;
  52.       d /= p;
  53.     }
  54.     nC *= k + 1;
  55.   }
  56.   return nC;
  57. }

  58. int main(void)
  59. {
  60.   int nCount = 0;
  61.   unsigned long long M = 1;
  62.   for (int n = 1; n <= N; ++n)
  63.   {
  64.     M *= 10;
  65.     for (int i = 0; i <= 2 * n; ++i)
  66.     {
  67.       unsigned long long K1 = mpow(i, 0);
  68.       if (K1 > M)
  69.         break;
  70.       for (int j = 0; j <= 2 * n; ++j)
  71.       {
  72.         unsigned long long K2 = K1 * mpow(0, j);
  73.         if (K2 > M)
  74.           break;
  75.         unsigned long long a = M + K2, b = M + mpow(2 * n - i, 2 * n - j);
  76.         unsigned long long d = gcd(a, b);
  77.         nCount += getdc(d);
  78.       }
  79.     }
  80.   }
  81.   cout << nCount << endl;
  82.   return 0;
  83. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-20 01:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表