HDU 5297 Y sequence Y数列
题意:给定正整数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数列的更多相关文章
- HDU 1711 Number Sequence(数列)
HDU 1711 Number Sequence(数列) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- HDU 1005 Number Sequence(数列)
HDU 1005 Number Sequence(数列) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
- HDU 5297 Y sequence 容斥 迭代
Y sequence 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5297 Description Yellowstar likes integer ...
- HDU - 5297:Y sequence (迭代&容斥)
Yellowstar likes integers so much that he listed all positive integers in ascending order,but he hat ...
- 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, ...
- [2015hdu多校联赛补题]hdu5297 Y sequence
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5297 题意:给你一个所有正整数的序列,然后去掉满足x^(2~r)的所有数(x为所有正整数,r>= ...
- HDU 5783 Divide the Sequence(数列划分)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- 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 ...
- HDU 5950 Recursive sequence 【递推+矩阵快速幂】 (2016ACM/ICPC亚洲区沈阳站)
Recursive sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
随机推荐
- Java并发和多线程3:线程调度和有条件取消调度
在第1篇中"并发框架基本示例",提到了Executors和ThreadPool.其中,还有个"定时调度"的方法,Executors.newScheduledTh ...
- ucore_lab0
一直想好好学习一下操作系统课程,去一个Mooc网站上找了一门操作系统的课程.这便是里面的配套实验. 实验指导:点这里 lab0主要是准备相关的操作环境.课程推荐使用qemu作为硬件模拟器,推荐运行环境 ...
- Linux用shell链接上传文件
yum install lrzsz 安装lrzsz ,直接拖拽到黑框框就可以上传了 或者使用 rz 命令,会弹出选择文件的框框
- 用LayerDrawable实现两个图片的叠加效果
Drawable[] layers = new Drawable[2]; layers[0] = new ColorDrawable(primaryColor); layers[1] = new Co ...
- IEEE的论文需要注意的一些
详细看最近的IEEE会议模板的时候,忽然注意到表的注序号应该用字母:另外,引用未发表的论文,如果是archive上的要使用archive规定的方法,或者标注``unpublished''
- Android自定义TabBar
转载请说明出处:http://www.sunhome.org.cn 我发现现在的移动开发界面都被iOS主导了,UI动不动设计出来的东西都是ios的风格,对于一个做Android的程序员来说甚是苦恼啊, ...
- Mysql数据库批量添加数据
1.目的: 用于向Mysql表中批量插入数据 2.过程: 3.语句 #删除已有存储过程 DROP PROCEDURE if exists insertdata; #设定命令行出现//后再执行语句 de ...
- HDU 3342 Legal or Not【拓扑排序】
题意:给出n,m,人的编号为 0到n-1,再给出m个关系,问能不能够进行拓扑排序 #include<iostream> #include<cstdio> #include< ...
- IE9 下的ajax缓存问题的处理
使用jQuery的getJSON从后台定时获取数据并刷新界面,使用以下方法时,在Chrome,Firefox下没问题,但在IE9下却无法刷新数据 1 2 3 4 5 $.getJSON(webAp ...
- [LOJ2422]【NOIP2015】斗地主
大名鼎鼎的NOIP2015D1T3 题意: 由于一些众所周知的原因,没有完整题面…… 给你一副斗地主的手牌(牌数<=23),问最少要几次能出完: 包含双王,没有癞子,连对要三连对以上,可以直接出 ...