PE 108 Diophantine reciprocals I (数论:分式个数)

古城微笑少年丶 2022-07-13 04:22 207阅读 0赞

PE108
分式1a+1b=1n的不同个数其实就是1+d(n2)2,其中d(n)是n的约数个数。

证明:1b=1n−1a=a−nan

==>b=ana−n

==>an−n(a−n)=n2,所以,gcd(an,a−n) divide n2

==>但是如果 a−n divide an 那么 gcd(an,a−n)=a−n ,那么 a−n divide n2

那么令 a=d+n,那么 d就是 n2的一个约数。

倒过来说,如果 d 是n2的一个约数,那么令 a=d+n

那么,b=ana−n=n(n+d)d=n+n2d

因为 b是一个整数,所以 d divide n2.

又因为1a+1a=1n,所以,a=2n

所以,1a+1b=1n的个数就是:d(n2)−12+1=d(n2)+12

代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. vector<int> primes;
  4. int prime[1000000];
  5. void getPrimes(int prime[] )
  6. {
  7. for(int i = 0 ; i < 1000000 ; i++){
  8. prime[i] = 1;
  9. }
  10. for(int i = 2 ; i < 1000000; i++)
  11. {
  12. if (prime[i])
  13. {
  14. primes.push_back(i);
  15. if(i <= (int)sqrt((double)1000000))
  16. {
  17. for(int t = i*i ; t<1000000 ; t+=i)//prime[i*i+k*i]=false
  18. {
  19. prime[t] = 0;
  20. }
  21. }
  22. }
  23. }
  24. }
  25. int divisors_Of_Squared(int n,int prime[] ) //
  26. {
  27. int p, e, i = 0, m = n, result = 1;
  28. while ( m > 1 )
  29. {
  30. e = 1;
  31. p = primes[i];
  32. while ( m % p == 0 )
  33. {
  34. e += 2;
  35. m /= p;
  36. }
  37. i++;
  38. result *= e;
  39. }
  40. //cout<<result<<endl;
  41. return result;
  42. }
  43. int factors(int n)
  44. {
  45. int i = 2, k = 0, m = n, count = 1;
  46. while(m > 1)
  47. {
  48. for(; i <= m; i ++)
  49. if(m % i == 0)
  50. {
  51. k = 1;
  52. while(m % i == 0)
  53. {
  54. k +=2; //k+=2就变成 n^2 的约数个数,k++;就是 n 的约数个数
  55. m /= i;
  56. }
  57. count *= k;
  58. }
  59. }
  60. return count;
  61. }
  62. int main()
  63. {
  64. cout<<factors(2)<<endl;
  65. int n, s;
  66. getPrimes(prime);
  67. for (n = 1; ; n ++ )
  68. {
  69. // s = (divisors_Of_Squared(n,prime) + 1 ) / 2; //快
  70. s=(factors(n)+1)/2; //慢
  71. if(s>1000)
  72. {
  73. break;
  74. }
  75. }
  76. cout<<"ans="<<n<<endl;
  77. return 0;
  78. }

发表评论

表情:
评论列表 (有 0 条评论,207人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Python分式计算

    简述 用python来进行分式计算,降低了数学工作者的压力。 方法 1. 使用sympy库。(在这个库中的运算都是分式的) 下面文章内容就是用sympy来进行分

    相关 LeetCode 108

    问题描述: 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。 示