BZOJ-2242 计算器 快速幂+拓展欧几里得+BSGS(数论三合一)
污污污污
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(数论三合一)的更多相关文章
- 【codevs 1565】【SDOI 2011】计算器 快速幂+拓展欧几里得+BSGS算法
BSGS算法是meet in the middle思想的一种应用,参考Yveh的博客我学会了BSGS的模版和hash表模板,,, 现在才会hash是不是太弱了,,, #include<cmath ...
- bzoj 2242 [SDOI2011]计算器 快速幂+扩展欧几里得+BSGS
1:快速幂 2:exgcd 3:exbsgs,题里说是素数,但我打的普通bsgs就wa,exbsgs就A了...... (map就是慢)..... #include<cstdio> # ...
- 【bzoj2242】: [SDOI2011]计算器 数论-快速幂-扩展欧几里得-BSGS
[bzoj2242]: [SDOI2011]计算器 1.快速幂 2.扩展欧几里得(费马小定理) 3.BSGS /* http://www.cnblogs.com/karl07/ */ #include ...
- 【bzoj1965】: [Ahoi2005]SHUFFLE 洗牌 数论-快速幂-扩展欧几里得
[bzoj1965]: [Ahoi2005]SHUFFLE 洗牌 观察发现第x张牌 当x<=n/2 x=2x 当x>n/2 x=2x-n-1 好像就是 x=2x mod (n+1) 就好 ...
- poj 1845 【数论:逆元,二分(乘法),拓展欧几里得,费马小定理】
POJ 1845 题意不说了,网上一大堆.此题做了一天,必须要整理一下了. 刚开始用费马小定理做,WA.(poj敢说我代码WA???)(以下代码其实都不严谨,按照数据要求A是可以等于0的,那么结果自然 ...
- Looooops(求解同余方程、同余方程用法)【拓展欧几里得】
Looooops(点击) A Compiler Mystery: We are given a C-language style for loop of type for (variable = A; ...
- [zoj 3774]Power of Fibonacci 数论(二次剩余 拓展欧几里得 等比数列求和)
Power of Fibonacci Time Limit: 5 Seconds Memory Limit: 65536 KB In mathematics, Fibonacci numbe ...
- Codeforces 898 B(拓展欧几里得)
Proper Nutrition 题意:有n元钱,有2种单价不同的商品,是否存在一种购买方式使得钱恰好花光,如果有输入任意一种方式,如果没有输出“NO” 题解:可以使用拓展欧几里得快速求解. #inc ...
- NOIP2012拓展欧几里得
拉板题,,,不说话 我之前是不是说过数据结构很烦,,,我想收回,,,今天开始的数论还要恶心,一早上听得头都晕了 先来一发欧几里得拓展裸 #include <cstdio> void gcd ...
随机推荐
- two sum - leetcode
Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...
- java 21 - 10 文本文件和集合之间互相存储数据
有时候,我们会遇到单独写入数据到文本文件的情况.比如: 需求:把ArrayList集合中的字符串数据存储到文本文件 分析: A:ArrayList集合中存储的是String类 B:要存储的文件是文本文 ...
- ArcGIS实现在线与线交叉处打断线(批量)
from:http://he1989.blog.163.com/blog/static/2052041092012631112459704/ 打开ArcgisDesktop中的ArcToolBox 找 ...
- 使用SilverLight开发区域地图分析模块
本人最近接收开发一个代码模块,功能主要是在页面上显示安徽省市地图,并且在鼠标移动到地图某市区域时,显示当前区域的各类信息等,一开始准备用百度地图,高德地图等地图工具进行开发,最后发现都不适合进行此类开 ...
- variable 'xxx' unsafe in 'case'的处理
问题描述: case get(?Player_LoopTaskInfo) of {TargetCnt, TaskStar, TaskExp} -> ok; _ -> throw(" ...
- Linux Linux程序练习七
题目:实现两个程序mysignal.mycontrl,mycontrl给mysignal发送SIGINT信号,控制mysignal是否在屏幕打印“hello”字符串. //捕捉信号 #include ...
- discuz编码转换UTF8与GBK互转完美适合Discuz3.x系列
由于一些网站通信编码的问题不得不把一直使用的网站编码由UTF8转为GBK,在转换过程中在官方看了很多方法,自己也都尝试了一些最后都没有能够成功,数据库的转换一直都是没有大问题,不存在丢失什么的,能看到 ...
- 本地RUN页面时候,将异常直接显示出来,而不是乱码
本地运行页面时,经常会遇到以下错误 oracle.jbo.JboException: JBO-29000: JBO-29000: JBO-26028: ???? MemberAttributesDis ...
- IBatis.Net学习笔记七--日志处理
IBatis.Net中提供了方便的日志处理,可以输出sql语句等调试信息. 常用的有两种:1.输出到控制台: <configSections> <sectionGroup ...
- VSS迁移备忘
今天早上服务器down掉了,没办法,只能把vss数据文件目录一并压缩,拷贝到本机.然后准备利用本机做服务端.下面是操作步骤: 1.将拷贝下来的文件夹设置为共享. 2.打开Microsoft Visua ...