题意:给定正整数n和r。定义Y数列为从正整数序列中删除全部能表示成a^b(2 ≤ b ≤ r)的数后的数列,求Y数列的第n个数是多少。

比如n = 10。 r = 3,则Y数列为2 3 5 6 7 10 11 12 13 14,第10个数是14。

非常有趣的一道数论题。题目给出的范围是long long范围的。

所以显然不用去枚举每一个数了,更不用说推断每一个数是不是某个数的某次方。那么这个题怎么下手呢。首先我们能够非常直观的想到,被删去的数显然是非常分散的。由于能表示成某个数的幂这种形式的数非常少。

于是我们想到一个大致的思路——从n開始计算,首先计算1~n中实际上在Y数列里的数的个数t,然后答案至少要往后再加上n - t个数(被删去的数的个数),如果当前加到了m。再计算1~m中实际上在Y数列里的数的个数,如果为x个数,看x是不是等于n,如果小于n的话。让m加上n
- x,再继续这样算 ...... 直到加到某个数ans时。1~ans中实际上在Y数列里的个数恰好为N,此时ans即为答案。

思路想到这里,有两个问题须要明确。

第一个,会不会加到超过正确答案呢?显然不会,由于每次加上的数都仅仅是被删去的数的个数,而新加的数有可能还有被删去的,所以肯定不会超过n。第二个,会不会效率非常低呢?当然也是不会的,由于被删去的数非常分散,新加进来的数里面又含有的应该被删去的数相对于当前新加进来的数来说是非常少非常少的,所以效率是非常高的。

那么问题仅仅剩下一个了——怎样高速求1~n里面有多少个数能表示成某个数的幂的形式。

我们这样想,首先删去全部的平方数。有n^(1/2)个。再删去全部的三次方数。有n^(1/3)个 ...... 这样枚举幂数b(从2開始),然后删去n^(1/b)个数,可是有反复的。比方某个数的6次方可能被平方数删去了一次,又被3次方数删去了一次,于是想到用容斥原理加回来。

这样,仅仅须要枚举幂为质数的b的值。

枚举质数b的时候,当b超过r就不再枚举。然后再用容斥求最后结果就可以。

当然。用pow函数是能够的。只是要注意精度。另外容斥的时候注意先不要把1算上去。最后答案减去1(由于1不管怎样都是要被删的)就可以。

下午打多校的时候各种写残。

。。。

各种WA各种TLE然后比赛完了就过了。

。。。晕。

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <string>
  5. #include <cmath>
  6. #include <algorithm>
  7. #include <stack>
  8. #include <vector>
  9. #include <map>
  10. #include <set>
  11. using namespace std;
  12.  
  13. //用负数方便计算容斥的符号
  14. const int mi[19] = {-2, -3, -5, -7, -11, -13, -17, -19, -23, -29, -31, -37, -41, -43, -47, -53, -59, -61, -67};
  15. long long n;
  16. int r;
  17. vector <int> rongchi; //须要用容斥计算的幂值
  18.  
  19. void get_rongchi()
  20. {
  21. rongchi.clear();
  22. for(int i = 0; abs(mi[i]) <= r; i++)
  23. {
  24. int temp = rongchi.size();
  25. for(int j = 0; j < temp; j++)
  26. {
  27. if(abs(mi[i]*rongchi[j]) <= 63)
  28. rongchi.push_back(mi[i]*rongchi[j]);
  29. }
  30. rongchi.push_back(mi[i]);
  31. }
  32. }
  33.  
  34. long long cal(long long x) //计算1~x里面实际上在Y数列里的数的个数
  35. {
  36. if(x == 1)
  37. return 0;
  38. long long ans = x;
  39. for(int i = 0; i < rongchi.size(); i++)
  40. {
  41. long long temp = (long long)(pow(x + 0.5, 1.0/abs(rongchi[i]))) - 1; // +0.5为了保证精度,-1是临时不计算1
  42. if(rongchi[i] < 0)
  43. ans -= temp;
  44. else
  45. ans += temp;
  46. }
  47. return ans - 1; //减去刚才没有计算的1,1是不管怎样要被删的
  48. }
  49.  
  50. void solve()
  51. {
  52. get_rongchi();
  53. long long ans = n;
  54. while(1)
  55. {
  56. long long temp = cal(ans);
  57. if(temp == n)
  58. break;
  59. ans += n - temp; //每次加上被删去的数的个数
  60. }
  61. printf("%I64d\n", ans);
  62. }
  63.  
  64. int main()
  65. {
  66. int T;
  67. scanf("%d", &T);
  68. while(T--)
  69. {
  70. scanf("%I64d%d", &n, &r);
  71. solve();
  72. }
  73. return 0;
  74. }



HDU 5297 Y sequence Y数列的更多相关文章

  1. HDU 1711 Number Sequence(数列)

    HDU 1711 Number Sequence(数列) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...

  2. HDU 1005 Number Sequence(数列)

    HDU 1005 Number Sequence(数列) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...

  3. HDU 5297 Y sequence 容斥 迭代

    Y sequence 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5297 Description Yellowstar likes integer ...

  4. HDU - 5297:Y sequence (迭代&容斥)

    Yellowstar likes integers so much that he listed all positive integers in ascending order,but he hat ...

  5. 2015 Multi-University Training Contest 1 - 10010 Y sequence

    Y sequence Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5297 Mean: 有连续数列A={1,2,3,4,5,6, ...

  6. [2015hdu多校联赛补题]hdu5297 Y sequence

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5297 题意:给你一个所有正整数的序列,然后去掉满足x^(2~r)的所有数(x为所有正整数,r>= ...

  7. HDU 5783 Divide the Sequence(数列划分)

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...

  8. 2015 Multi-University Training Contest 1 y sequence

    Y sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  9. HDU 5950 Recursive sequence 【递推+矩阵快速幂】 (2016ACM/ICPC亚洲区沈阳站)

    Recursive sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

随机推荐

  1. Java基础学习总结(33)——Java8 十大新特性详解

    Java8 十大新特性详解 本教程将Java8的新特新逐一列出,并将使用简单的代码示例来指导你如何使用默认接口方法,lambda表达式,方法引用以及多重Annotation,之后你将会学到最新的API ...

  2. synchronized的实现原理及锁优化

    记得刚刚开始学习Java的时候,一遇到多线程情况就是synchronized.对于当时的我们来说,synchronized是如此的神奇且强大.我们赋予它一个名字“同步”,也成为我们解决多线程情况的良药 ...

  3. WinServer-IIS-Dynamic IP Restrictions

    动态IP限制 来自为知笔记(Wiz)

  4. POI 导入excel数据自己主动封装成model对象--代码分析

    上完代码后,对代码进行基本的分析: 1.主要使用反射api将数数据注入javabean对象 2.代码中的日志信息级别为debug级别 3.获取ExcelImport对象后须要调用init()方法初始化 ...

  5. 2)Win10-UWA开发 API參考 - 1

    孙广东  2015.8.23 大多数 Windows 执行时 API 如今适用于 Windows Phone 应用商店应用以及 Windows 应用商店应用,这意味着当你创建同一时候面向 Window ...

  6. FreeRTOS系列第13篇---FreeRTOS内核控制

    内核控制的一些功能须要移植层提供,为了方便移植.这些API函数用宏来实现,比方上下文切换.进入和退出临界区.禁止和使能可屏蔽中断.内核控制函数还包含启动和停止调度器.挂起和恢复调度器以及用于低功耗模式 ...

  7. 哈理工2015暑假训练赛 zoj 2078Phone Cell

    Phone CellTime Limit:10000MS    Memory Limit:32768KB    64bit IO Format:%lld & %llu SubmitStatus ...

  8. 【翻译自mos文章】怎么正确的计算一个ip地址的subnet id?

    怎么正确的计算一个ip地址的subnet id? 来源于: How to calculate the correct subnet for an interface (文档 ID 1059759.1) ...

  9. AJAX入门---点滴的积累

    AJAX入门---点滴的积累 每次学习完一个内容总会写上几句话总结一下学习的内容.这不刚看完王兴魁老师讲的AJAX核心技术.如今回想梳理一下. 这套视频的内容不多,简单的解说了XMLHttpReque ...

  10. 英语影视台词---七、THE GREAT GATSBY QUOTES

    英语影视台词---七.THE GREAT GATSBY QUOTES 一.总结 一句话总结:了不起的盖茨比 1.“So we beat on, boats against the current, b ...