题意:给定正整数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然后比赛完了就过了。

。。。晕。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <stack>
#include <vector>
#include <map>
#include <set>
using namespace std; //用负数方便计算容斥的符号
const int mi[19] = {-2, -3, -5, -7, -11, -13, -17, -19, -23, -29, -31, -37, -41, -43, -47, -53, -59, -61, -67};
long long n;
int r;
vector <int> rongchi; //须要用容斥计算的幂值 void get_rongchi()
{
rongchi.clear();
for(int i = 0; abs(mi[i]) <= r; i++)
{
int temp = rongchi.size();
for(int j = 0; j < temp; j++)
{
if(abs(mi[i]*rongchi[j]) <= 63)
rongchi.push_back(mi[i]*rongchi[j]);
}
rongchi.push_back(mi[i]);
}
} long long cal(long long x) //计算1~x里面实际上在Y数列里的数的个数
{
if(x == 1)
return 0;
long long ans = x;
for(int i = 0; i < rongchi.size(); i++)
{
long long temp = (long long)(pow(x + 0.5, 1.0/abs(rongchi[i]))) - 1; // +0.5为了保证精度,-1是临时不计算1
if(rongchi[i] < 0)
ans -= temp;
else
ans += temp;
}
return ans - 1; //减去刚才没有计算的1,1是不管怎样要被删的
} void solve()
{
get_rongchi();
long long ans = n;
while(1)
{
long long temp = cal(ans);
if(temp == n)
break;
ans += n - temp; //每次加上被删去的数的个数
}
printf("%I64d\n", ans);
} int main()
{
int T;
scanf("%d", &T);
while(T--)
{
scanf("%I64d%d", &n, &r);
solve();
}
return 0;
}



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. jvm 堆、栈 、方法区概念和联系

    一.三者联系 1.堆:解决数据的存储问题( 即 数据怎么放,放到哪 ). 2.栈:解决程序运行的问题( 即 程序如何执行,或者说如何处理数据 ). 3.方法区:辅助堆栈的一块永久区,解决堆栈信息的产生 ...

  2. Nginx 实现反向代理

    Nginx 实现反向代理 两个域名指向同一台 Nginx 服务器,用户访问不同的域名显示不同的网页内容 两个域名分别是 www.test1.com www.test2.com 1.准备工作 下载及安装 ...

  3. SQL学习之使用order by 依照指定顺序排序或自己定义顺序排序

    我们通常须要依据客户需求对于查询出来的结果给客户提供自己定义的排序方式,那么我们通常sql须要实现方式都有哪些,參考很多其它资料总结例如以下(不完好的和错误望大家指出): 一.假设我们仅仅是对于在某个 ...

  4. linux内核模块笔记

    主题: 1. 嵌入式基础知识 2. linux内核介绍 3. 内核的编译和安装(x86) 4. 第一个模块 5. 模块的相关工具 6. 模块的符号导出 7. 模块的參数 1.看linux/module ...

  5. adt-bundle-windows加入NDK支持

    近期换了个硬盘,曾经都是用eclipse安装adt插件的,如今老了,图省事就下载了adt-bundle-windows,解压缩出来就直接用.但是这个adt-bundle没有集成NDK支持,于是手动安装 ...

  6. &quot;浪潮杯&quot;第六届ACM山东省省赛山科场总结

    从空间拷过来的.尽管已经过去一个月了.记忆犹新 也算是又一次拾起这个blog Just begin 看着一群群大牛还有队友男神的省赛总结都出了 我最终也耐不住寂寞 来做个流水账抒抒情好了 第一次省赛 ...

  7. 关于iOS7中UIView效果失效问题的解决

    最近想做一个跑马灯的效果.于是写出了例如以下的跑马灯效果的代码...可是调试发现,在iOS6下动画是能够运行的,可是在iOS7下动画并不运行,没有达到预期的效果. [_scrollLabel size ...

  8. bzoj4868: [Shoi2017]期末考试(三分法)

    4868: [Shoi2017]期末考试 题目:传送门 题解: Get到一个新姿势...三分法 一开始百度百科的时候下了一跳...中国...的根??? 学懂了之后其实运用起来就根二分差不多啊,不过证明 ...

  9. No connection could be made because the target machine actively refused it [::1]:808

    No connection could be made because the target machine actively refused it [::1]:808 1.首先查看端口占用情况, 在 ...

  10. cookie、sessionStorage和localStorage

    title: cookie.sessionStorage和localStorage toc: false date: 2018-09-25 16:49:57 cookie 由于HTTP协议是无状态的, ...