题目描述

Let's denote as L(x,p)L(x,p) an infinite sequence of integers yy such that gcd(p,y)=1gcd(p,y)=1 and y>xy>x (where gcdgcd is the greatest common divisor of two integer numbers), sorted in ascending order. The elements of L(x,p)L(x,p) are 11 -indexed; for example, 99 , 1313 and 1515 are the first, the second and the third elements of L(7,22)L(7,22) , respectively.

You have to process tt queries. Each query is denoted by three integers xx , pp and kk , and the answer to this query is kk-th element of L(x,p)L(x,p) .

输入输出格式

输入格式:

The first line contains one integer tt ( 1<=t<=300001<=t<=30000 ) — the number of queries to process.

Then tt lines follow. ii -th line contains three integers xx , pp and kk for ii -th query ( 1<=x,p,k<=10^{6}1<=x,p,k<=106 ).

输出格式:

Print tt integers, where ii -th integer is the answer to ii -th query.

输入输出样例

输入样例#1:

3
7 22 1
7 22 2
7 22 3
输出样例#1:

9
13
15
输入样例#2:

5
42 42 42
43 43 43
44 44 44
45 45 45
46 46 46
输出样例#2:

187
87
139
128
141 二分+容斥就ojbk了,考虑到<=10^6的数最多有10种质因子,我们就把p质因子分解一下,然后二分第k大的满足条件的数y是多少。
需要写一个用来计算前i个数中有多少数与p互质的函数get,那么当get(y)-get(x)>=k时,更新答案并调整右边界;否则调整左边界。
之所以这么做的原因是,我们需要找到get(y)-get(x)==k的最小的y,这个y才是要求的第k大的与p互质的数。 还有不是很明白为什么时限是5s(虽然看洛谷上好多人都是卡着时限过的),反正我最慢的一个点也才跑了300+ms,如图
可能是因为我加了一些预处理来优化计算过程吧hhhh,请不要把我想成用循环展开什么缓存dark技巧来卡常的毒瘤人士(虽然迫不得已的时候会用一些dark卡常技巧)
#include<bits/stdc++.h>
#define ll long long
#define maxn 1000005
using namespace std;
int num,d[66],f[2066],jc[2066];
int T,n,a,p,k,ci[30];
int l,r,mid,ans,now;
const int inf=1000000000; inline void dvd(){
num=0,n=sqrt(p+0.5);
for(int i=2;i<=n;i++) if(!(p%i)){
d[++num]=i;
while(!(p%i)) p/=i;
if(p==1) break;
} if(p!=1) d[++num]=p; for(int S=0;S<ci[num];S++){
jc[S]=1;
for(int j=0;j<num;j++) if(ci[j]&S) jc[S]*=d[j+1];
}
} //<=x的数中有多少与p互质
inline int get(int x){
int an=0;
for(int s=0;s<ci[num];s++) an+=f[s]*(x/jc[s]);
return an;
} int main(){
ci[0]=1;
for(int i=1;i<=20;i++) ci[i]=ci[i-1]<<1;
f[0]=1;
for(int i=1;i<=2055;i++) f[i]=-f[i^(i&-i)]; scanf("%d",&T);
while(T--){
scanf("%d%d%d",&a,&p,&k);
dvd();
l=a+1,r=inf,now=get(a);
while(l<=r){
mid=l+r>>1;
if(get(mid)-now<k) l=mid+1;
else ans=mid,r=mid-1;
} printf("%d\n",ans);
} return 0;
}

  


Codeforces 920 G List Of Integers的更多相关文章

  1. Educational Codeforces Round 37 G. List Of Integers (二分,容斥定律,数论)

    G. List Of Integers time limit per test 5 seconds memory limit per test 256 megabytes input standard ...

  2. [codeforces 549]G. Happy Line

    [codeforces 549]G. Happy Line 试题描述 Do you like summer? Residents of Berland do. They especially love ...

  3. CodeForces 794 G.Replace All

    CodeForces 794 G.Replace All 解题思路 首先如果字符串 \(A, B\) 没有匹配,那么二元组 \((S, T)\) 合法的一个必要条件是存在正整数对 \((x,y)\), ...

  4. codeforces 920 EFG 题解合集 ( Educational Codeforces Round 37 )

    E. Connected Components? time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  5. Codeforces 1207 G. Indie Album

    Codeforces 1207 G. Indie Album 解题思路 离线下来用SAM或者AC自动机就是一个单点加子树求和,套个树状数组就好了,因为这个题广义SAM不能存在 \(len[u] = l ...

  6. Educational Codeforces Round 37-G.List Of Integers题解

    一.题目 二.题目链接 http://codeforces.com/contest/920/problem/G 三.题意 给定一个$t$,表示有t次查询.每次查询给定一个$x$, $p$, $k$,需 ...

  7. codeforces 659 G. Fence Divercity 组合数学 dp

    http://codeforces.com/problemset/problem/659/G 思路: f(i,0/1,0/1) 表示到了第i个,要被切的块开始了没有,结束了没有的状态的方案数 递推看代 ...

  8. Codeforces 803 G. Periodic RMQ Problem

    题目链接:http://codeforces.com/problemset/problem/803/G 大致就是线段树动态开节点. 然后考虑到如果一个点还没有出现过,那么这个点显然未被修改,就将这个点 ...

  9. Codeforces 954 G. Castle Defense

    http://codeforces.com/problemset/problem/954/G 二分答案 检验的时候,从前往后枚举,如果发现某个位置的防御力<二分的值,那么新加的位置肯定是越靠后越 ...

随机推荐

  1. volatile的原理分析

    前言:Volatile作为一个多线程开发中的强有力的轻量级的线程协助工具,在实际编程中随处可见,它比synchronized更加轻量和方便,消耗的资源更少,了解Volatile对后面了解多线程有很重要 ...

  2. innodb_force_recovery

    Warning Before using innodb_force_recovery ensure that you have a backup copy of your database in ca ...

  3. HDU 1556 线段树/树状数组/区间更新姿势 三种方法处理

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  4. APP本地服务安全测试

    一.安全测试基本分类: 1.系统安全 系统加固 安全加固:比如linux中关闭telnet端口,修改ssh端口 检测一些不必要的服务(需要卸载一个ping)--保证系统的最小集 app安全加固:加一层 ...

  5. IDEA 用maven创建web项目编译时不能发布resources中的文件

    1.在pom.xml加入 <build> <resources> <resource> <directory>${basedir}/src/main/j ...

  6. AMD 和 CMD的区别

    AMD 是 RequireJS 在推广过程中对模块定义的规范化产出.CMD 是 SeaJS 在推广过程中对模块定义的规范化产出.类似的还有 CommonJS Modules/2.0 规范,是 Brav ...

  7. [Evernote]印象笔记使用经验技巧

    一    软件使用      现在使用Windows客户端的印象笔记 + iPhone移动端印象笔记 + chrome浏览器剪藏插件.      在试用了很多云笔记后,还是选择了印象笔记,并且有许多的 ...

  8. java封装的使用

    一:前言 其实以前我们来学习java特性的时候,对于封装好想觉得没什么用处,至少我那个时候的感觉(不知道是不是我学的太浅薄了~),现在由于项目从零开始做得,在做得过程中我感觉到原来封装是这样用的. 二 ...

  9. python-列表 字典 集合 元祖 字符串的相关总结练习

    1.执行python脚本的两种方式指定解释器执行在交互器中执行 2.简述位.字节的关系:ASCII1个二进制位是计算机里的最小表示单元1个字节是计算机里最小的储存单元二进制位=8bits(位)8bit ...

  10. 关于hrtimer_forward小段代码的分析【转】

    转自:http://blog.csdn.net/wowuyinglingluan/article/details/45720151 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?) ...