PE 110 Diophantine reciprocals II (数论:分式个数)(加强版)(dfs)

冷不防 2022-07-13 05:28 211阅读 0赞

PE 110题目
PE 108 题解

从PE 108 我们可以知道,分式 1a+1b=1n 的个数 就是1+d(n2)2,其中d(n)是n的约数的个数。、

而 PE 110 只是PE 108的加强版。用PE 108的方法 换个方式就可以了。
比如:

n=2p13p25p3……

d(n2)=N=∏i=1(2pi+1)

所以我们可以知道样例是怎么来的。

样例:

1260=22325171

d(n2)=N=5∗5∗3∗3=225

综合 1+d(n2)2,所以答案就是225+12=113。

我们要求的,只是倒过来求 n 而已。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. ll primes[16]={
  5. 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47,53};
  6. ll ans;
  7. void dfs(ll down, ll upper, ll build, ll cost)
  8. {
  9. if(cost > ans)return;
  10. if(build > 7999999) //4000000 * 2 -1
  11. {
  12. ans=min(ans, cost);
  13. return;
  14. }
  15. if(down>=16)return;
  16. for(ll i = upper;i>=1;i--)
  17. {
  18. ll tmp=1;
  19. for(int j = 1 ; j <= i ; j++)
  20. {
  21. tmp*=primes[down];
  22. }
  23. if((double) tmp*cost > (double)ans) continue;
  24. dfs(down + 1, i , build * ( 2 * i + 1 ), tmp * cost);
  25. }
  26. }
  27. int main()
  28. {
  29. ans=1e18;
  30. dfs(0, 20, 1, 1);
  31. printf("%lld\n", ans);
  32. return 0;
  33. }

发表评论

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

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

相关阅读