1. 快速幂

  2. 扩展欧几里得

  3. 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的更多相关文章

  1. 【bzoj2242】 SDOI2011—计算器

    http://www.lydsy.com/JudgeOnline/problem.php?id=2242 (题目链接) 题意 给出y,z,p.求:1.yz mod p:2.xy=z(mod p):3. ...

  2. BSGS[bzoj2242][bzoj3122]

    数论题. 操作一:直接快速幂就好了. 操作二:我用了exgcd,shy和lyz都喜欢欧拉函数...QAQ最后这块还写错了. 对于ax+by=gcd(a,b)的形式,我们可以把他们变成y'x+p'y=1 ...

  3. 【BZOJ2242】计算器(BSGS,快速幂)

    [BZOJ2242]计算器(BSGS,快速幂) 题面 BZOJ 洛谷 1.给定y.z.p,计算y^z mod p 的值: 2.给定y.z.p,计算满足xy ≡z(mod p)的最小非负整数x: 3.给 ...

  4. 【BZOJ2242】[SDOI2011]计算器 BSGS

    [BZOJ2242][SDOI2011]计算器 Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ ...

  5. 【bzoj2242】: [SDOI2011]计算器 数论-快速幂-扩展欧几里得-BSGS

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

  6. [bzoj2242][Sdoi2011]计算器_exgcd_BSGS

    计算器 bzoj-2242 Sdoi-2011 题目大意:裸题,支持快速幂.扩展gcd.拔山盖世 注释:所有数据保证int,10组数据. 想法:裸题,就是注意一下exgcd别敲错... ... 最后, ...

  7. BZOJ2242 [SDOI2011]计算器

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  8. 【BZOJ2242】【SDoi2011】计算器 快速幂+EXGCD+BSGS

    Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数: 3.给 ...

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

    污污污污 2242: [SDOI2011]计算器 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 2312 Solved: 917 [Submit][S ...

  10. bzoj2242: [SDOI2011]计算器 && BSGS 算法

    BSGS算法 给定y.z.p,计算满足yx mod p=z的最小非负整数x.p为质数(没法写数学公式,以下内容用心去感受吧) 设 x = i*m + j. 则 y^(j)≡z∗y^(-i*m)) (m ...

随机推荐

  1. cmd 连接到指定路径

    cmd 刚刚打开的时候默认路径可能不是自己想要的路径的时候,如何转到自己希望的路径,方法如下: 1.首先敲下想存的硬盘符:D:   2.敲下 cd+文件路径:   总结:其实这次只是简单测试一下上传图 ...

  2. C++学习笔记3—对话框

    1.模态对话框 CTipDlg tipDlg; INT_PTR nResponse = tipDlg.DoModal(); if(nResponse == IDCANCEL) {  return; } ...

  3. iOS 中二维码扫描(zxingObjc和原生)

    对于网上的第三方 ZXingObjC,自我感觉是对原生的AVFoundation中关于二维码部分的一个封装,大致看看ZXingObjC的内部实现其事和原生的实现相似的,里面都用到了AVFoundati ...

  4. ibatis+spring+cxf+mysql搭建webservice

    首先需必备:mysql.myeclipse6.5.apache-cxf-2.6.2 一.建数据库,库名:cxf_demo:表名:book CREATE DATABASE `cxf_demo`  --数 ...

  5. 使用jeesite org.springframework.beans.NotReadablePropertyException: Invalid property 'tfxqCmsAccount.id' of bean class

    一对多 对子表添加时在form表单 path="tfxqCmsAccount.id"页面报错,对比了下其他可行的,发现其自动生成的子类少了个构造方法 加上 public TfxqC ...

  6. 动态规划&矩阵连乘

    动态规划&矩阵连乘 动态规划的概念 •     与分治方法类似       分-治-合 • 与分治方法不同       子问题之间并非相互独立 •     基本思想        用一个表记录 ...

  7. DataReader 和 DataSet 的区别

    摘自:http://www.cnblogs.com/zhjjNo1/archive/2009/08/26/1554420.html 第一种解释 DataReader和DataSet最大的区别在于,Da ...

  8. Nginx中让 重写后的路径 自动增加斜线 /

    http://www.111cn.net/sys/nginx/56067.htm(参考文章) 现在有个这样的需求,在重写的url地址后,自动加斜线 / 例如 xx.com/abc/1-2  (默认ur ...

  9. 『奇葩问题集锦』function * (next){ 执行报错 SyntaxError: Unexpected token *

    这是因为  app.use(function * (){ 语句中有一个 * ,这种方式被称为generator functions ,一般写作function *(){...} 的形式,在此类func ...

  10. IDEA插件开发基础

    由于简易ORM的需要,想要做一些代码自动生成功能(通过右键菜单辅助) 半自动编写代码,故考虑需要开发IDE插件(我司现使用IDEA) 1.例子代码http://confluence.jetbrains ...