bsgs BSGS

Question:
had know a,b,c;
ask min x;
made a^x=b(mod c);

think:
make m=ceil(sqrt(c));
make x=i*m-j;
so a^(i*m-j)=b(mod c)
so a^(i*m)/a^j=b(mod c)
so a^(i*m)=b*a^j(mod c)

easy to meijv i,j to full this deng shi

ANS:

answer=min(i*m-j);

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<map>
 6 #define ll longlong
 7 #define readln(n) scanf("%lld",&n);
 8 #define writeln(n) printf("%lld",n);
 9
10 using namespace std;
11
12 map<ll,int>mp;
13
14 inline ll f(ll a,ll b,ll mod)
15 {
16     ll ans=1;
17     while(b)
18     {
19         if(b&1) ans=ans*a%mod;
20         a=a*a%mod;
21         b>>=1;
22     }
23     return ans;
24 }
25
26 int main()
27 {
28     ll n;//a^x=b(mod)c,a^(i*m)=b*(a^j)(mod)
29     readln(n);
30     ll a,b,c;
31     readln(a);readln(b);readln(c);
32     if(!a%c){printf("!!!"); return 0; }
33     ll m=ceil(sqrt(c));
34     ll ans=b%c;
35     mp[ans]=0;
36     for(int i=1;i<=m;i++)
37     {
38         asn=(ans*a)%c;
39         mp[ans]=i;
40     }
41     ll ff=f(a,m,c);
42     ans=1;
43     bool flag=1;
44     for(int i=1;i<=m;i++)
45     {
46         ans=ans*f%c;
47         if(mp[ans])
48         {
49             ll answer=i*m-mp[ans];
50             writeln((answer%c+c)%c);
51             flag=0;
52         }
53     }
54     if(!flag)
55     printf("!!!");
56 }
时间: 2024-11-08 22:13:27

bsgs BSGS的相关文章

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

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 对于每个询问,输出一行答案.对

BSGS与ExBSGS:大步小步法

BSGS与ExBSGS:大步小步法 朴素BSGS \(BSGS\)也就是\(Baby~ Step~ Giant~ Step\),用以解决形如以下的问题: 求解\(A^x \equiv B (mod~C)\)的最小整数解.其中\(A\)与\(C\)互质. 设\(x = am - b\)则原式变为 \[ A^{am-b}\equiv B(mod~C) \] \[ A^{am}\equiv B\times A^b(mod~C) \] 然后我们假设\(m = \sqrt {C}\)则\(a \in [1

BSGS和EXBSGS

也许更好的阅读体验 \(Description\) 给定\(a,b,p\),求一个\(x\)使其满足\(a^x\equiv b\ \left(mod\ p\right)\) \(BSGS\) \(BSGS\)可以解决\(p\)为质数的情况 令 \(m=\lceil \sqrt p\rceil\) 令 \(x=i\cdot m-k\) 有 \(a^{i\cdot m-k} \equiv b\ (mod\ p)\) 两边同乘 \(a^k\) 得 \(a^{i\cdot m}\equiv b\cdot

【POJ 3243】Clever Y 拓展BSGS

调了一周,我真制杖,,, 各种初始化没有设为1,,,我当时到底在想什么??? 拓展BSGS,这是zky学长讲课的课件截屏: 是不是简单易懂.PS:聪哥说“拓展BSGS是偏题,省选不会考,信我没错”,那是因为聪哥早就会了,所以他觉得学这个没用,信他才怪233 #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef lo

数论之高次同余方程(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)必定是一个循环节(不一定是最小的)

Discrete Logging POJ - 2417(BSGS)

Discrete Logging POJ - 2417 题意:给P,B,N,求最小的L使得 BL≡N (mod P) Baby Step Giant Step 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <cmath> 5 #define ll long long 6 using namespace std; 7 const int maxn=76543;

【bzoj3122】: [Sdoi2013]随机数生成器 数论-BSGS

[bzoj3122]: [Sdoi2013]随机数生成器 当a>=2 化简得 然后 BSGS 求解 其他的特判 : 当 x=t  n=1 当 a=1  当 a=0 判断b==t 1 /* http://www.cnblogs.com/karl07/ */ 2 #include <cstdlib> 3 #include <cstdio> 4 #include <cstring> 5 #include <cmath> 6 #include <map&

[Sdoi2013]随机数生成器(BSGS)

#include<map> #include<cmath> #include<cstdio> #include<iostream> #define ll long long using namespace std; inline int read(){ int x=0;char ch=getchar(); while(ch<'0'||ch>'9')ch=getchar(); while(ch>='0'&&ch<='9'

【BZOJ-3122】随机数生成器 BSGS

3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1362  Solved: 531[Submit][Status][Discuss] Description Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. 注意:P一定为质数 Output 共T行,每行一个整数表示他最早读到第t页是