bzoj2242
快速幂
扩展欧几里得
baby-step-giant-step
可以自行baidu
程序附部分注释
const key=;
type link=^node;
node=record
re,wh:longint;
next:link;
end; var hash:array[..key] of link;
a:array[..] of longint;
j,g,ans,w,i,n,ch,t,p,z,y:longint;
x,step,k,now:int64; function quick(y,z,p:longint):int64;
var t,i:longint;
begin
quick:=;
t:=;
while z<> do
begin
inc(t);
a[t]:=z mod ;
z:=z div ;
end;
for i:=t downto do
begin
quick:=sqr(quick) mod p;
if a[i]= then quick:=quick*y mod p;
end;
end; function gcd(a,b:longint):longint;
begin
if b= then exit(a)
else exit(gcd(b,a mod b));
end; procedure exgcd(a,b:longint;var x,y:int64); //扩展欧几里得
var xx,yy:int64;
begin
if b= then
begin
x:=;
y:=;
end
else begin
exgcd(b,a mod b,x,y);
xx:=x;
yy:=y;
x:=yy;
y:=xx-(a div b)*yy;
end;
end; procedure add(x,i:longint);
var p:link;
begin
w:=x mod key;
p:=hash[w];
while p<>nil do
begin
if p^.re=x then break;
p:=p^.next;
end;
if p=nil then
begin
new(p);
p^.re:=x;
p^.wh:=i;
p^.next:=hash[w];
hash[w]:=p;
end;
end; function find(x:longint):longint;
var p:link;
begin
find:=-;
w:=x mod key;
p:=hash[w];
while p<>nil do
begin
if p^.re=x then exit(p^.wh);
p:=p^.next;
end;
end; begin
readln(n,ch);
for i:= to n do
begin
readln(y,z,p);
if ch= then
writeln(quick(y,z,p)) //快速幂不多说
else if ch= then
begin
g:=gcd(y,p);
if z mod g<> then //先判断线性模方程是否有解
begin
writeln('Orz, I cannot find x!');
continue;
end;
y:=y div g;
p:=p div g;
z:=z div g;
exgcd(y,p,x,k); //转化为二元一次不定方程
x:=((x*z mod p)+p) mod p; //注意是最小非负数
writeln(x);
end
else begin
z:=z mod p;
t:=trunc(sqrt(p))+; 当t选址为根号p时时间复杂度最优
for j:= to key do
hash[j]:=nil;
now:=;
add(,);
for j:= to t do //求出a^i mod p(<=i<=t) 的值,并映射到hash上,每个模保留最小的i
begin
now:=now*y mod p;
add(now,j);
end;
g:=gcd(now,p);
if g<> then //求出a^t关于mod p的逆元,没有逆元则无解
begin
writeln('Orz, I cannot find x!');
continue;
end
else begin
now:=now div g;
w:=p div g;
end;
exgcd(now,w,x,k);
x:=(x+w) mod w;
ans:=-;
step:=z;
for j:= to t- do
begin
k:=find(step); //大小步寻找 对于a^it ~ a^(i+)t- (<=i<=t-) 寻找可行解
//存在可行解即存在hash中存在模=z*x^i mod p (x表示a^t的逆元)
if k>- then
begin
ans:=k+j*t;
break;
end;
step:=step*x mod p;
end;
if ans=- then writeln('Orz, I cannot find x!')
else writeln(ans);
end;
end;
end.
bzoj2242的更多相关文章
- 【bzoj2242】 SDOI2011—计算器
http://www.lydsy.com/JudgeOnline/problem.php?id=2242 (题目链接) 题意 给出y,z,p.求:1.yz mod p:2.xy=z(mod p):3. ...
- BSGS[bzoj2242][bzoj3122]
数论题. 操作一:直接快速幂就好了. 操作二:我用了exgcd,shy和lyz都喜欢欧拉函数...QAQ最后这块还写错了. 对于ax+by=gcd(a,b)的形式,我们可以把他们变成y'x+p'y=1 ...
- 【BZOJ2242】计算器(BSGS,快速幂)
[BZOJ2242]计算器(BSGS,快速幂) 题面 BZOJ 洛谷 1.给定y.z.p,计算y^z mod p 的值: 2.给定y.z.p,计算满足xy ≡z(mod p)的最小非负整数x: 3.给 ...
- 【BZOJ2242】[SDOI2011]计算器 BSGS
[BZOJ2242][SDOI2011]计算器 Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ ...
- 【bzoj2242】: [SDOI2011]计算器 数论-快速幂-扩展欧几里得-BSGS
[bzoj2242]: [SDOI2011]计算器 1.快速幂 2.扩展欧几里得(费马小定理) 3.BSGS /* http://www.cnblogs.com/karl07/ */ #include ...
- [bzoj2242][Sdoi2011]计算器_exgcd_BSGS
计算器 bzoj-2242 Sdoi-2011 题目大意:裸题,支持快速幂.扩展gcd.拔山盖世 注释:所有数据保证int,10组数据. 想法:裸题,就是注意一下exgcd别敲错... ... 最后, ...
- BZOJ2242 [SDOI2011]计算器
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- 【BZOJ2242】【SDoi2011】计算器 快速幂+EXGCD+BSGS
Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数: 3.给 ...
- BZOJ-2242 计算器 快速幂+拓展欧几里得+BSGS(数论三合一)
污污污污 2242: [SDOI2011]计算器 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 2312 Solved: 917 [Submit][S ...
- bzoj2242: [SDOI2011]计算器 && BSGS 算法
BSGS算法 给定y.z.p,计算满足yx mod p=z的最小非负整数x.p为质数(没法写数学公式,以下内容用心去感受吧) 设 x = i*m + j. 则 y^(j)≡z∗y^(-i*m)) (m ...
随机推荐
- 双程动态规划 nyoj61
题目大意: 在矩阵m*n中,从(1,1)点到(m,n)点,再从(m,n)点到(1,1)点,所走路线经过的同学最大好心值, 要求每个点只能走一遍. 分析: ①我们可以把它只看成两个人同时从(1,1)点, ...
- 开源控件ViewPagerIndicator学习
导航条指示器.ViewPagerIndicator 地址 https://github.com/JakeWharton/ViewPagerIndicator Style是重用控件的一种技术.类似CSS ...
- gdal中文路径无法打开问题
在C#中使用OGR读写矢量数据时,需要引用“using OSGeo.OGR;”. 同时为了处理中文路径和中文字段,需要在开始设置下面两个属性,代码如下: //为了支持中文路径,请添加下面这句代码(大多 ...
- OC加强-day05
#program mark - 0_11 NSRange结构体介绍 [掌握] 是Foundation框架中的一个结构体 NSRange 定义的一个变量的两个属性 location:起始下标 lengt ...
- 初识CoreText
一.基本知识介绍 1.字符(Character)和字形(Glyphs) 排版系统中文本显示的一个重要的过程就是字符到字形的转换,字符是信息本身的元素,而字形是字符的图形表征,字符还会有其它表征比如发音 ...
- Codevs 1800 假面舞会 2008年NOI全国竞赛
1800 假面舞会 2008年NOI全国竞赛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 一年一度的假面舞会又开始了,栋栋也 ...
- SGU 281.Championship
题意: 有n(n≤50000)支队伍参加了两场比赛,分别有两个排名.现在要求输出总排名,如果对任意m,在两个排名的前m个队伍都相同,那么在总排名前m个队伍就是这些队伍.其它情况按字典序排. Solut ...
- struts2请求过程源码分析(转)
Struts2是Struts社区和WebWork社区的共同成果,我们甚至 可以说,Struts2是WebWork的升级版,他采用的正是WebWork的核心,所以,Struts2并不是一个不成熟的产品, ...
- laravel队列-让守护进程处理耗时任务
待解决的问题 最近在做一个服务器集群管理的web项目,需要处理一些极其耗时的操作,比如磁盘格式化分区.对于这个需求,最开始的想法是,为了让节点上的rpc(远程过程调用) service端尽可能简单(简 ...
- Mysql修改设置root密码的命令及方法
方法一:使用SQL语句命令UPDATE 需用到Mysql自带的加密函数PASSWORD(string),该函数对一个明文密码进行加密,但不能解密.专门用于mysql.user(用户权限表)中设置密码, ...