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 重载方法,参数为NULL时,调用的处理 (精确性原则)
引子:大家可以思考一下下面程序的输出结果 public class TestNull { public void show(String a){ System.out.println("St ...
- Shiro:整合swagger2时需要放行的资源
filterMap.put("/swagger-ui.html", "anon"); filterMap.put("/swagger-resource ...
- Vue 做项目经验
Vue 做项目经验 首先需要知道最基本的东西是: Vue 项目打包:npm run build Vue生成在网页上看的端口:npm run dev 修改端口号的地方在: config文件夹下index ...
- 极路由4pro安装java(Jamvm 2.0.0 + gnu classpath 0.9.8)
首先试了gnu classpath 0.9.9,编译不过后来改成0.9.8 编译环境 OS: 64位 Ubuntu 16.04 LTS(vmware虚拟机) SDK: 用之前讲过的官方SDKmtmip ...
- Bing地图切片原理
Bing地图切片系统 Bing地图提供了一个可以直接平移和缩放的世界地图.为了让地图操作更加平滑和及时响应,我们选择提前渲染地图不同层级的细节,并把每个层级的地图切割成为瓦片以便快速的还原展示.这篇文 ...
- [React] Understanding setState in componentDidMount to Measure Elements Without Transient UI State
In this lesson we'll explore using setState to synchronously update in componentDidMount. This allow ...
- [CSS3] Create Dynamic Styles with CSS Variables
In this lesson we are going to use CSS variables to keep our application's colors consistent. This i ...
- Oracle字符乱码、数据越界訪问典型Bug分析
Oracle字符乱码.数据越界訪问典型Bug分析 前言: 作为乙方,在甲方客户那里验收阶段发现两个诡异Bug. 下面就问题来源.问题根因.解决方式.怎样避免做具体描写叙述. .且两 ...
- [linux]shell中,反引號(`)的应用
反引號位 (`) 位于键盘的Tab键的上方.1键的左方.注意与单引號(')位于Enter键的左方的差别. 反引號位 (`)在Linux中起着命令替换的作用. 命令替换是指shell可以将一个命令的标准 ...
- POJ2449题解
先讲一个为了少打一些代码而滥用继承终于接受慘痛教训的故事. #include <cstdio> #include <algorithm> #include <queue& ...