Y sequence

Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5297


Mean:

有连续数列A={1,2,3,4,5,6,7,8 .....},将可以表示成a^b次方的数删除,a={1,2,3,4,5...},而2<=b<=r,删除后形成一个新的数列,求这个数列的第n项。

analyse:

很有趣的一道数论题。

对于给定的一个n,如果我们知道1~n中被删除的数字为k个,那么答案一定大于等于n+k,所以向后至少移动k个数。

但是n~n+k这一段中也可能含有被删除的数字,所以我们再求n~n+k这一段中被删除的数字的个数,假设为x1个,那么我们就得到了一个比x更精确的数字x1,即:我们要得到第n项,至少需要从n向后移动x1位。

但是移动x1位后同样还可能存在以上的问题,那么什么时候停止呢?答案是:当本次算的xi和上次算的xi相等时,就说明这个值是固定的了,也就是最终的精确值,代表第n项就是n+xi,也就是最终的答案。

有了这个理论基础后,我们来考虑如何求得1~n中有多少个数字能够表示成次幂形式。

解决这个问题的方法是反函数。幂的反函数是依然是幂函数,指数取导就行。

例:10以内能表示成a^2的数的个数为:pow(10,1/2) ; 100以内能表示成a^4的数的个数是:pow(100,1/4).

还有一个问题:在删除数的时候,a^6的数已经被a^2和a^3的数删过了,这样就造成了重复删除。

这儿就需要容斥原理来解决:只需要删质数次幂的数就行,而且还需要把质数的乘积(多删的)删除的数字加回来。

详情参考大牛博客:http://blog.csdn.net/firstlucker/article/details/46991885

Time complexity: O(N)

Source code: 

  1. /*
  2. * this code is made by crazyacking
  3. * Verdict: Accepted
  4. * Submission Date: 2015-07-22-15.56
  5. * Time: 0MS
  6. * Memory: 137KB
  7. */
  8. #include <queue>
  9. #include <cstdio>
  10. #include <set>
  11. #include <string>
  12. #include <stack>
  13. #include <cmath>
  14. #include <climits>
  15. #include <map>
  16. #include <cstdlib>
  17. #include <iostream>
  18. #include <vector>
  19. #include <algorithm>
  20. #include <cstring>
  21. #define LL long long
  22. #define ULL unsigned long long
  23. using namespace std;
  24. long long t, n, r;
  25. const int p[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67};
  26. vector<int> rongchi;
  27. void get_rongchi()
  28. {
  29. rongchi.clear();
  30. for( int i = 0; p[i] <= r; ++i )
  31. {
  32. int si = rongchi.size();
  33. for( int j = 0; j < si; ++j )
  34. {
  35. if( abs( p[i]*rongchi[j] ) <= 63 )
  36. rongchi.push_back( -p[i]*rongchi[j] );
  37. }
  38. rongchi.push_back( p[i] );
  39. }
  40. }
  41.  
  42. long long cal( long long x )
  43. {
  44. if( x == 1 ) return 0;
  45. long long ans = x;
  46. for( int i = 0; i < rongchi.size(); ++i )
  47. {
  48. long long tmp = ( long long )( pow( x + 0.5 , 1.0 / abs( rongchi[i] ) ) ) - 1;
  49. if( rongchi[i] < 0 ) ans += tmp;
  50. else ans -= tmp;
  51. }
  52. return ans - 1;
  53. }
  54. long long solve()
  55. {
  56. get_rongchi();
  57. long long ans = n;
  58. while( true )
  59. {
  60. long long tmp = cal( ans );
  61. if( tmp == n )break;
  62. ans += n - tmp;
  63. }
  64. return ans;
  65. }
  66.  
  67. int main()
  68. {
  69. ios_base::sync_with_stdio( false );
  70. cin.tie( 0 );
  71. cin >> t;
  72. while( t-- )
  73. {
  74. cin >> n >> r;
  75. cout << solve() << endl;
  76. }
  77. return 0;
  78. }
  79. /*
  80.  
  81. */

  

  

2015 Multi-University Training Contest 1 - 10010 Y sequence的更多相关文章

  1. 2015 Multi-University Training Contest 1 OO’s Sequence

    OO’s Sequence Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

  2. 2016 Multi-University Training Contest 5 Divide the Sequence

    Divide the Sequence 题意: 给你一个序列A,问你最多能够分成多少个连续子序列,使得每个子序列的所有前缀和均不小于0 题解: 这题是比赛时候的水题,但我比的时候也就做出这一题, = ...

  3. 2018 Multi-University Training Contest 1 - B Balanced Sequence (贪心)

    题意:对N个由(,)组成的字符串,求拼接后得到的最大的balance序列的长度.balance序列:空串/ A+B(A,B都是b序列)/ (+A+),A为b序列.此三种情况. 分析:在读入N每个字符串 ...

  4. 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 ...

  5. 2015 Multi-University Training Contest 8 hdu 5390 tree

    tree Time Limit: 8000ms Memory Limit: 262144KB This problem will be judged on HDU. Original ID: 5390 ...

  6. Root(hdu5777+扩展欧几里得+原根)2015 Multi-University Training Contest 7

    Root Time Limit: 30000/15000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Su ...

  7. hdu 5416 CRB and Tree(2015 Multi-University Training Contest 10)

    CRB and Tree                                                             Time Limit: 8000/4000 MS (J ...

  8. 2015 Multi-University Training Contest 10 hdu 5412 CRB and Queries

    CRB and Queries Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Other ...

  9. 2015 Multi-University Training Contest 7 hdu 5378 Leader in Tree Land

    Leader in Tree Land Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe ...

随机推荐

  1. CDN技术分享

    CDN技术分享目录 网络应用服务发展 CDN技术 1.CDN是什么?为什么我们需要它?(简介) 2.CDN能做什么?(作用) 3.CDN是如何工作?(原理) 4.CDN有那些具体应用?(应用) 我们项 ...

  2. Android开发:第四日——SQLite初接触

    一.SQLite 介绍 SQLite一个非常流行的轻量级嵌入式数据库,SQLite支持多数的SQL92标准,在一些场合下其性能优于MySql等数据库引擎,并且只利用很少的内存就有很好的性能.此外它还是 ...

  3. 自己写的一个Yeoman的Generator-Require-Angularjs

    Yeoman是一个常见的工作流,能够很方面的搭建属于自己的脚手架. 这段时间我用闲暇时间写了一个Generator来玩了一下,这个Generator的主要目的是快速建立一个RequireJS+Angu ...

  4. python环境中运行程序

    运行Python程序,我们比较常用的是直接在Windows命令提示窗口或者Linux终端或shell窗口中,直接:Python *.py,或者在Linux环境下,在投不中,加入: #!/usr/bin ...

  5. ./adb: cannot execute binary file:

    问题描述: 在32位ubuntu(12.04)上下载了最新的android SDK,使用SDK manager 下载ADB之后发现,无法运行ADB命令,排除权限问题,在网上搜到答案: http://a ...

  6. SQL SERVER 服务启动后停止,某些服务由其它服务或程序使用时将自动停止

    发生症状: 先是服务器挂掉,之后服务器可以登陆,但是实例却不能登陆进去(部分).出现的错误日志如下: :: R2 (SP2) - 10.50.4000.0 (X64) Jun :: Copyright ...

  7. node-webkit 笔记

    NW.js is an app runtime based on Chromium and node.js. You can write native apps in HTML and JavaScr ...

  8. TypeError: Cannot read property 'root' of null

    解决办法: brew upgrade watchman

  9. struts2:struts.xml配置文件详解

    1. 几个重要的元素 1.1 package元素 package元素用来配置包.在Struts2框架中,包是一个独立的单位,通过name属性来唯一标识包.还可以通过extends属性让一个包继承另一个 ...

  10. 彻底解决Android SDK Manager更新慢的问题

    Android SDK 下载速度慢,解决方法大概有两种.第一,FQ.这种方法比较彻底,但是要想有稳定的效果还的要花大价钱.第二,有些高人直接给了SDK中各软件的下载地址,直接下载速度非常快,下载后将包 ...