poj2417 Baby-StepGiant-StepAlgorithm a^x=b%P

#include <iostream>
#include <algorithm>
#include <string.h>
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long LL;
struct Node{
  int idx;
  LL val;
  Node(int cidx=0, LL cval=0){
     idx=cidx;
     val=cval;
  }
  bool operator <(const Node &rhs)const{
     return val<rhs.val||( val == rhs.val && idx<rhs.idx );
  }
}P[1000000];
LL pow_mod(LL a, LL n, LL mod)
{
     LL ans=1;
     while(n)
     {
         if(n&1)ans=(ans*a)%mod;
         n>>=1;
         a=(a*a)%mod;
     }
     return ans;
}
int bitsearch(LL d,int n)
{
     int L=0,R=n-1;
     while(L<=R)
     {
         int mid=(L+R)>>1;
         if(P[mid].val==d) return P[mid].idx;
         if(P[mid].val<d) L=mid+1;
         else R=mid-1;
     }
     return -1;
}
LL log_mod(LL a, LL b, LL n)
{
    LL m,v,e=1;
    m=(sqrt(n+0.5))+1;
    v=pow_mod(a,n-m-1,n);
    P[0]=Node(0,1);
    for(int i=1; i<m; i++)
    {
         e=(e*a)%n;
         P[i]=Node(i,e);
    }
    sort(P,P+m);
    int cnt=1;
    for(int i=0; i<m; i++)
        if(P[i].val!=P[cnt-1].val) P[cnt++]=P[i];
    for(int i=0; i<m; i++)
    {
          int loc=bitsearch(b,cnt);
          if(loc!=-1){
            return i*m+loc;
          }
          b=(b*v)%n;
    }

    return -1;
}
int main()
{
    LL P,B,N;
    while(scanf("%I64d%I64d%I64d",&P,&B,&N)==3)
    {
        LL d =log_mod(B,N,P);
        if(d==-1)puts("no solution");
        else printf("%I64d\n",d);
    }
    return 0;
}
时间: 2024-10-17 08:04:57

poj2417 Baby-StepGiant-StepAlgorithm a^x=b%P的相关文章

[原博客] BZOJ 2242 [SDOI2011] 计算器

题目链接 noip级数论模版题了吧.让求三个东西: 给定y,z,p,计算Y^Z Mod P 的值. 给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数. 给定y,z,p,计算满足Y^x ≡ Z ( mod P)的最小非负整数. 其中P均为素数.来分着处理. 1 y^z%p 快速幂.推荐一种又快又好写的写法. 1 LL power_mod(LL a,LL b,LL p){ //get a^b%p 2 LL ret=1; 3 while(b){ 4 if(b&1) ret = re

【poj2417】baby step giant step

最近在学习数论,然而发现之前学的baby step giant step又忘了,于是去翻了翻以前的代码,又复习了一下. 觉得总是忘记是因为没有彻底理解啊. 注意baby step giant step只能用在b和p互质的情况下,因为只有b和p互质的情况下,b才有mod p下的逆元.(下面要用到逆元) 当b和p不互质,就要处理一下.现在就正在做这么一题,方法以后再写. 求a^(-m)就用到了求逆元了,那么如何求逆元呢?我学了两种方法: ·1:欧拉定理:当a和n互质,a^φ ( n) ≡ 1(mod

数论之高次同余方程(Baby Step Giant Step + 拓展BSGS)

什么叫高次同余方程?说白了就是解决这样一个问题: A^x=B(mod C),求最小的x值. baby step giant step算法 题目条件:C是素数(事实上,A与C互质就可以.为什么?在BSGS算法中是要求a^m在%c条件下的逆元的,如果a.c不互质根本就没有逆元.) 如果x有解,那么0<=x<C,为什么? 我们可以回忆一下欧拉定理: 对于c是素数的情况,φ(c)=c-1 那么既然我们知道a^0=1,a^φ(c)=1(在%c的条件下).那么0~φ(c)必定是一个循环节(不一定是最小的)

hdu5612 Baby Ming and Matrix games (dfs加暴力)

Baby Ming and Matrix games Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 849    Accepted Submission(s): 211 Problem Description These few days, Baby Ming is addicted to playing a matrix game.

BestCoder Round #69 (div.2) Baby Ming and Weight lifting(hdu 5610)

Baby Ming and Weight lifting Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 681    Accepted Submission(s): 280 Problem Description Baby Ming is fond of weight lifting. He has a barbell pole(the

黄晓明大尺度戏不用问Baby:她拍吻戏也没报备

腾讯娱乐讯 据香港媒体报道,黄晓明为新电影<偷天特务>(内地片名<王牌逗王牌>)接受媒体的长途电访,当媒体问及Angelababy是不是有了"Baby",原本访问时有问必答的晓明突然没出声,电话一端的工作人员马上阻止问题,媒体见晓明没出声否认,赶紧二话不说的恭喜他,这时,晓明才发出"哈哈哈哈哈"以示回应.五个"哈"是什么意思,是有了吗?没有怀孕,应该可以直接说没有吧! 杨颖在不久前推出的好莱坞大制作<独立日2>

HDU 5610 Baby Ming and Weight lifting

Baby Ming and Weight lifting Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1365    Accepted Submission(s): 500 Problem Description Baby Ming is fond of weight lifting. He has a barbell pole(th

HDU 2815 扩展baby step giant step 算法

题目大意就是求 a^x = b(mod c) 中的x 用一般的baby step giant step 算法会超时 这里参考的是http://hi.baidu.com/aekdycoin/item/236937318413c680c2cf29d4 map平衡树查找值 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <cmath> 5 #include <

Baby Ming and Matrix games(dfs计算表达式)

Baby Ming and Matrix games Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1210    Accepted Submission(s): 316 Problem Description These few days, Baby Ming is addicted to playing a matrix game

移动应用平台 火爆 为什么 黄晓明baby大婚如此火爆到呢?

最近几天最爆的娱乐新闻无疑是黄晓明baby大婚,这就是媒体.广告起着巨大的的影响和作用.那么, 随着移动互联网的迅猛发展,移动广告也是变得炙手可热,移动广告平台也如雨后春笋般纷纷涌现,对于开发者来说,自己开发出来的APP受大众欢迎是大家都希望看到的,但如何利用自已的APP帮自己赚到money呢?我想也是广大开发者朋友最关心的话题了吧! 目前来说,在APP里加入广告,是最直接的赚钱方式.但是目前市场上移动广告平台很多,而且支持的广告类型.风格也不一样,那如何来选择一家适合自已APP的移动广告平台呢