BZOJ-2242 计算器 快速幂+拓展欧几里得+BSGS(数论三合一)

时间:2023-02-01 22:04:36
污污污污

2242: [SDOI2011]计算器

Time Limit: 10 Sec Memory Limit: 512 MB

Submit: 2312 Solved: 917

[Submit][Status][Discuss]

Description

你被要求设计一个计算器完成以下三项任务:

1、给定y,z,p,计算Y^Z Mod P 的值;

2、给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数;

3、给定y,z,p,计算满足Y^x ≡ Z ( mod P)的最小非负整数。

Input

输入包含多组数据。

第一行包含两个正整数T,K分别表示数据组数和询问类型(对于一个测试点内的所有数据,询问类型相同)。

以下行每行包含三个正整数y,z,p,描述一个询问。

Output

对于每个询问,输出一行答案。对于询问类型2和3,如果不存在满足条件的,则输出“Orz, I cannot find x!”,注意逗号与“I”之间有一个空格。

Sample Input

【样例输入1】

3 1

2 1 3

2 2 3

2 3 3

【样例输入2】

3 2

2 1 3

2 2 3

2 3 3

【数据规模和约定】

对于100%的数据,1<=y,z,p<=10^9,为质数,1<=T<=10。

Sample Output

【样例输出1】

2

1

2

【样例输出2】

2

1

0

HINT

Source

第一轮day1

第一问:快速幂直接搞;
第二问:拓展欧几里得直接搞;
第三问:BSGS直接搞;

安利一下BSGS的大体框架:

首先要求 a^x=b (mod c)

假定x=im-j (m=ceil(sqrt(n)))

那么进行变换:

a^im = b*a^j (mod c)

枚举b*a^j mod p的值存入哈希表(map)。

再枚举a^im的值,从哈希表里找,如果能找到一样的答案就是i*m-j

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map> using namespace std;
int n; int read()
{
int x=0,f=1; char ch=getchar();
while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}
while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}
return x*f;
} int gcd(int a,int b)
{
if (!b) return a;
else return gcd(b,a%b);
} void exgcd(int a,int b,int &x,int &y)
{
if (!b) {x=1,y=0;return;}
exgcd(b,a%b,x,y);
int t=x;x=y;
y=t-a/b*y;
} long long quick_pow(long long a,int b,int p)//返回a^b%p的值
{
long long re=1;
long long tmp=a%p;
while (b)
{
if (b&1)
re=(re*tmp)%p;
tmp=(tmp*tmp)%p;
b=b>>1;
}
return re;
} void work1(int a,int b,int c)
{
printf("%lld\n",quick_pow(a,b,c));
}
void work2(int a,int b,int c)
{
c=-c;
int gc=gcd(a,c);
if (b%gc!=0) {puts("Orz, I cannot find x!");return;}
a/=gc;b/=gc;c/=gc;
int x,y;exgcd(a,c,x,y);
x=(long long)x*b%c;
while (x<0) x+=c;
printf("%d\n",x);
}
void work3(int a,int b,int c)
{
map<int,int>mp;mp.clear();
if (a%c==0) {puts("Orz, I cannot find x!");return;}
int m=ceil(sqrt(c));
long long t=b;
for (int i=0; i<=m; i++)
{
mp[(int)t]=i;
t=t*a%c;
}
int s=quick_pow(a,m,c);t=s;
for (int i=1; i<=m; i++)
{
int v=mp[(int)t];
if (v!=0) {printf("%d\n",i*m-v);return;}
t=t*s%c;
}
puts("Orz, I cannot find x!");
} int main()
{
int t=read(),k=read();
for (int i=1; i<=t; i++)
{
int y=read(),z=read(),p=read();
if (k==1) work1(y,z,p);
if (k==2) work2(y,z,p);
if (k==3) work3(y,z,p);
}
return 0;
}

BZOJ-2242 计算器 快速幂+拓展欧几里得+BSGS(数论三合一)的更多相关文章

  1. 【codevs 1565】【SDOI 2011】计算器 快速幂&plus;拓展欧几里得&plus;BSGS算法

    BSGS算法是meet in the middle思想的一种应用,参考Yveh的博客我学会了BSGS的模版和hash表模板,,, 现在才会hash是不是太弱了,,, #include<cmath ...

  2. bzoj 2242 &lbrack;SDOI2011&rsqb;计算器 快速幂&plus;扩展欧几里得&plus;BSGS

    1:快速幂  2:exgcd  3:exbsgs,题里说是素数,但我打的普通bsgs就wa,exbsgs就A了...... (map就是慢)..... #include<cstdio> # ...

  3. 【bzoj2242】&colon; &lbrack;SDOI2011&rsqb;计算器 数论-快速幂-扩展欧几里得-BSGS

    [bzoj2242]: [SDOI2011]计算器 1.快速幂 2.扩展欧几里得(费马小定理) 3.BSGS /* http://www.cnblogs.com/karl07/ */ #include ...

  4. 【bzoj1965】&colon; &lbrack;Ahoi2005&rsqb;SHUFFLE 洗牌 数论-快速幂-扩展欧几里得

    [bzoj1965]: [Ahoi2005]SHUFFLE 洗牌 观察发现第x张牌 当x<=n/2 x=2x 当x>n/2 x=2x-n-1 好像就是 x=2x mod (n+1)  就好 ...

  5. poj 1845 【数论:逆元,二分(乘法),拓展欧几里得,费马小定理】

    POJ 1845 题意不说了,网上一大堆.此题做了一天,必须要整理一下了. 刚开始用费马小定理做,WA.(poj敢说我代码WA???)(以下代码其实都不严谨,按照数据要求A是可以等于0的,那么结果自然 ...

  6. Looooops&lpar;求解同余方程、同余方程用法&rpar;【拓展欧几里得】

    Looooops(点击) A Compiler Mystery: We are given a C-language style for loop of type for (variable = A; ...

  7. &lbrack;zoj 3774&rsqb;Power of Fibonacci 数论&lpar;二次剩余 拓展欧几里得 等比数列求和&rpar;

    Power of Fibonacci Time Limit: 5 Seconds      Memory Limit: 65536 KB In mathematics, Fibonacci numbe ...

  8. Codeforces 898 B(拓展欧几里得)

    Proper Nutrition 题意:有n元钱,有2种单价不同的商品,是否存在一种购买方式使得钱恰好花光,如果有输入任意一种方式,如果没有输出“NO” 题解:可以使用拓展欧几里得快速求解. #inc ...

  9. NOIP2012拓展欧几里得

    拉板题,,,不说话 我之前是不是说过数据结构很烦,,,我想收回,,,今天开始的数论还要恶心,一早上听得头都晕了 先来一发欧几里得拓展裸 #include <cstdio> void gcd ...

随机推荐

  1. iOS 关于iOS开发中的delegate

    有A.B两个对象,A要完成某件事,想让B帮它做. 这时候,A中就要实例化一个B的对象b,A还要在头文件中声明协议,然后在B中实现协议中对应的方法. 这时候再把A的delegate设置为b,在需要的地方 ...

  2. 洛谷 P1991 无线通讯网 Label:最小生成树 &vert;&vert; 二分

    题目描述 国防部计划用无线网络连接若干个边防哨所.2 种不同的通讯技术用来搭建无线网络: 每个边防哨所都要配备无线电收发器:有一些哨所还可以增配卫星电话. 任意两个配备了一条卫星电话线路的哨所(两边都 ...

  3. 利用Sonar规则结合WebStorm进行Code Inspect

    1.目的 在编写代码时会受到公司Sonar规则的限制,不想在编写完成后再对代码进行Inspect,回头再来一个个修正,费时费力. 那么,下面将通过优秀的WebStorm开发工具自身的CodeInspe ...

  4. &lbrack;转&rsqb;asp&period;net mvc 从数据库中读取图片

    本文转自:http://www.cnblogs.com/mayt/archive/2010/05/20/1740358.html 首先是创建一个类,继承于ActionResult,记住要引用Syste ...

  5. typedef struct

    突然忘了这玩意儿了..今天就来搞一发 typedef是类型定义的意思.typedef struct 是为了使用这个结构体方便.具体区别在于:若struct node {}这样来定义结构体的话.在申请n ...

  6. SurfaceFlinger

    D:\linux\ubuntu\touch\libhybris\libhybris_0.1.0+git20130606+c5d897a.orig\libhybris-0.1.0+git20130606 ...

  7. TCP&sol;IP详细说明--滑模、拥塞窗口、慢启动、Negle算法

    TCP的数据流大致能够分为两类,交互数据流与成块的数据流. 交互数据流就是发送控制命令的数据流.比方relogin,telnet.ftp命令等等.成块数据流是用来发送数据的包,网络上大部分的TCP包都 ...

  8. eclipse或者AS链接手机真机之后,logcat里面日志信息乱跳

    乱跳的日志信息不会对应用产生影响,但是它会影响视觉,影响查看logcat.那主要原因在哪里呢 ? 这是由于手机里面,正在的运行的进程太多导致的.^_^ 因此课件添加过滤器的作用之大. 对了,在logc ...

  9. Visual Studio Code Tips

    新项目要用到Visual Studio Code, 在使用的过程中有些tips, 记录下来以便查阅. 1. 自动保存代码 文件 => 自动保存 2. 帮助输入代码模式 扩展 => 安装HT ...

  10. CF558E

    非常好的一道题,是线段树的常见玩法 将字符串转化为1~26个数 对区间开一棵线段树,用两个数组分别维护区间中1~26每个数的个数以及一个区间覆盖标记,表示这个区间是否被某一个值覆盖了 在每次排序时,首 ...