题目描述

YJC把核弹发射密码忘掉了……其实是密码被加密了,但是YJC不会解密。密码由n个数字组成,第i个数字被加密成了如下形式:第k小的满足(2^L)|(P-1)且P为质数的P。YJC希望你能帮他算出密码是多少。

输入输出格式

输入格式:

第一行包含一个整数n,表示密码中的数字个数。

接下来n行每行两个整数L和k,表示一个数字的加密形式。

注意,输入格式变更,请注意L和k的先后顺序

输出格式:

输出n行,第i行一个整数,表示第i个数字。

输入输出样例

输入样例#1:

2
21 92
23 9
输出样例#1:

1998585857
998244353

说明

对于50%的数据,满足18≤n,L≤1000。

对于100%的数据,满足12≤n,L≤500000,保证答案<2^31。

分析:比较考验人品的一道题。

暴力找的话有30分.时间都浪费在了怎么判断素数上,而且询问很多,每个数可能会被判断多次,考虑怎么优化它们.

对于素数的判断,可以用一个比较考验人品的算法miller rabin测试,每一次都有大约1/4的概率会出错,因此要多判几次,但是多判几次又会超时,将次数控制在3次到5次就可以了.这里利用费马小定理+快速幂进行判断.

接下来考虑怎么不重复判断同一个数。我们将询问的L按照降序排序,符合条件的数肯定是k*2^i+1的形式,我们先从大到小枚举i,再枚举k,k枚举的是奇数,因为如果我们一个一个地枚举,如果k=2,那么就会跳到2^(i+1) + 1上去,而我们之前已经计算过了这个数,会造成重复.将所得的素数排个序.

最后考虑怎么快速得到第k小的p,因为我们已经将所得的素数排好序了,所以我们可以二分查找,由于之前我们将询问的L按照降序排列,那么得到的满足要求的数就构成了一个又一个的区间,那么利用树状数组来维护有多少个比它小的就可以了.

听说还有还可以用等差数列筛法,orz

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std;
const int maxn = << ,maxm = ; long long n,cnt,num[maxm],prime[maxm],t[maxm],ans[maxm],c[maxm];
struct node
{
long long l, k;
int id;
}e[maxm]; long long qpow(long long a, long long b, long long mod)
{
long long ans = ;
while (b)
{
if (b & )
ans = (ans * a) % mod;
b >>= ;
a = (a * a) % mod;
}
return ans;
} bool isok(long long x)
{
if (qpow(, x - , x) == && qpow(, x - , x) == && qpow(, x - , x) == )
return true;
return false;
} bool cmp1(node a, node b)
{
return a.l > b.l;
} int main()
{
scanf("%lld", &n);
for (int i = ; i <= n; i++)
{
scanf("%lld%lld", &e[i].l, &e[i].k);
e[i].id = i;
}
sort(e + , e + + n, cmp1);
for (int i = ; i >= ; num[i--] = cnt)
for (int j = ; 1LL * j * ( << i) < (1LL << ) - ; j += )
if (isok(j * ( << i) + ))
prime[++cnt] = j * ( << i) + ;
memcpy(t, prime, sizeof(prime));
sort(t + , t + + cnt);
for (int i = ; i <= cnt; i++)
prime[i] = lower_bound(t + , t + + cnt, prime[i]) - t; //实际上是把符合要求的质数和离散化了
int cur = ;
for (int i = ; i <= n; i++)
{ while (cur <= num[e[i].l])
{
for (int j = prime[cur]; j < maxn; j += j & -j)
c[j]++;
cur++;
} int l = , r = maxn, sum = ;;
while (l<r)
{
int mid = (l + r) >> ;
sum += c[mid];
if (sum >= e[i].k)
{
sum -= c[mid];
r = mid;
}
else l = mid + ;
}
ans[e[i].id] = t[l];
}
for (int i = ; i <= n; i++)
printf("%lld\n", ans[i]); return ;
}

noip模拟赛 密码的更多相关文章

  1. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  2. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  3. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  4. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  5. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  6. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

  7. 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...

  8. CH Round #58 - OrzCC杯noip模拟赛day2

    A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...

  9. CH Round #52 - Thinking Bear #1 (NOIP模拟赛)

    A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...

随机推荐

  1. P2597 [ZJOI2012]灾难(倍增LCA+拓扑排序)

    传送门 据大佬说这玩意儿好像叫灾难树还是灭绝树? 我们先按建图,设点$u$的食物有$x[1]...x[k]$,即在图中这些点都有一条指向它的边 以样例来说,对于人,羊和牛都有一条指向它的边,然而不管是 ...

  2. Python基础:一起来面向对象 (一)

    类,一群有着相同属性和函数的对象的集合 如果你不满足于只做一个+CRUD“码农”,而是想成为一个优秀的工程师,那就一定要积极锻炼直觉思考和快速类比的能力,其是在找不到bug的时候 类的示例: clas ...

  3. Python之列表生成式、生成器

    列表生成式 ——可以快速生成list,可以通过一个list推导出另一个list,而代码却十分简洁: >>> [x * x for x in range(1, 11)] [1, 4, ...

  4. [LOJ#10064]黑暗城堡

    Description 在顺利攻破 Lord lsp 的防线之后,lqr 一行人来到了 Lord lsp 的城堡下方.Lord lsp 黑化之后虽然拥有了强大的超能力,能够用意念力制造建筑物,但是智商 ...

  5. 429c Leha and Function

    题目 解题报告 F(n, k)是在集合{1, 2, 3, ..., n}中所有的具有k个元素的子集中分别取最小值,相加后的期望. 例如:要求F(4, 2),根据定义有{1, 2}, {1, 3}, { ...

  6. 枚举+贪心 HDOJ 4932 Miaomiao's Geometry

    题目传送门 /* 题意:有n个点,用相同的线段去覆盖,当点在线段的端点才行,还有线段之间不相交 枚举+贪心:有坑点是两个点在同时一条线段的两个端点上,枚举两点之间的距离或者距离一半,尽量往左边放,否则 ...

  7. C# 调用非托管函数

    C#通过DllImport可以直接调用Windows中的一些功能.C++中已经编写好的一些方法: DllImport所在的名字空间:System.Runtime.InteropServices; Dl ...

  8. CF804B Minimum number of steps

    思路: 找规律.参考了http://blog.csdn.net/harlow_cheng/article/details/71190999. 实现: #include <iostream> ...

  9. C++学习笔记(一)之指针

    指向指针的引用 ; int * p; int *&r = p; //r为对指针p的引用 r = &i; //r为对p的引用,故对r赋值即将p指向i *r = ; //更新i的值 通过* ...

  10. springboot项目中,@transactional 无效

    问题: springboot项目,依然是使用jpa.Hibernate来操作mysql,涉及到数据库的操作,就少不了事务.写了一个接口,用来测试@Transaction注解的作用,发现没有效果 分析: ...