Clever Y POJ - 3243 (扩展BSGS)

Clever Y

POJ - 3243

题意:给a,c,b,求最小的x使得 ax≡b (mod c)。

扩展BSGS算法~

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <cmath>
 5 #define ll long long
 6 using namespace std;
 7 const int mod=99991;
 8 ll head[mod],nex[mod];
 9 ll cnt;
10 ll hs[mod],id[mod];
11 void init(){
12     memset(head,-1,sizeof(head));
13     cnt=0;
14 }
15 void insert_(ll x,ll i){
16     hs[cnt]=x;id[cnt]=i;
17     ll u=x%mod;
18     nex[cnt]=head[u];
19     head[u]=cnt++;
20 }
21 ll find_(ll x){
22     int u=x%mod;
23     for(int i=head[u];~i;i=nex[i]){
24         if(hs[i]==x) return id[i];
25     }
26     return -1;
27 }
28 ll gcd(ll a,ll b){
29     ll r=a%b;
30     while(r){a=b;b=r;r=a%b;}
31     return b;
32 }
33 ll BSGS(ll a,ll b,ll c){
34     a%=c;b%=c;
35     if(b==1) return 0;
36     ll g=1,d=1,k=0;
37     while((g=gcd(a,c))!=1){
38         if(b%g) return -1;
39         b/=g;c/=g;
40         k++;
41         d=d*(a/g)%c;
42         if(b==d) return k;
43     }
44     ll m=ceil(sqrt(c*1.0)),q=1;
45     for(ll i=0;i<=m;i++){
46         if(i==0) insert_(b,i);
47         else {
48             q=q*a%c;
49             insert_(q*b%c,i);
50         }
51     }
52     for(ll i=1;i<=m;i++){
53         d=d*q%c;
54         ll j=find_(d);
55         if(j!=-1) return i*m-j+k;
56     }
57     return -1;
58 }
59 int main(){
60     ll a,b,c;
61     while(scanf("%lld%lld%lld",&a,&c,&b)&&(a+b+c)){
62         init();
63         ll ans=BSGS(a,b,c);
64         if(ans==-1) puts("No Solution");
65         else printf("%lld\n",ans);
66     }
67 }

时间: 2024-10-07 18:45:21

Clever Y POJ - 3243 (扩展BSGS)的相关文章

POJ 3243 Clever Y 扩展BSGS

http://poj.org/problem?id=3243 这道题的输入数据输入后需要将a和b都%p https://blog.csdn.net/zzkksunboy/article/details/73162229 在大约sqrt( p )的复杂度求出 ( a^x ) % p = b % p中的x 扩展bsgs增加了对p不是素数的情况的处理. 扩展bsgs在处理过a,b,p之后进行bsgs的时候x处理不到num以下的部分,这部分在处理a,b,p的时候处理过了(b=1输出num)所以不用考虑.

POJ 3243 Clever Y BSGS

Clever Y Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 6861   Accepted: 1676 Description Little Y finds there is a very interesting formula in mathematics: XY mod Z = K Given X, Y, Z, we all know how to figure out K fast. However, give

【EXT-BSGS算法求离散对数】POJ Clever Y 3243

Clever Y Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 7259 Accepted: 1795 Description Little Y finds there is a very interesting formula in mathematics: XY mod Z = K Given X, Y, Z, we all know how to figure out K fast. However, given X,

poj 3243 Clever Y 高次方程

1 Accepted 8508K 579MS C++ 2237B/** 2 hash的强大,,还是高次方程,不过要求n不一定是素数 3 **/ 4 #include <iostream> 5 #include <cstdio> 6 #include <cmath> 7 #include <cstring> 8 #include <algorithm> 9 using namespace std; 10 long long a,b,n; 11 co

bzoj 3283 扩展BSGS + 快速阶乘

T2  扩展BSGS T3 快速阶乘 给定整数n,质数p和正整数c,求整数s和b,满足n! / pb = s mod pc 考虑每次取出floor(n/p)个p因子,然后将问题转化为子问题. 1 /************************************************************** 2 Problem: 3283 3 User: idy002 4 Language: C++ 5 Result: Accepted 6 Time:1704 ms 7 Memor

POJ 3243 // HDU 2815(改下输出,加个判断)

A^x = B (mod C) 的模板题,不够要用扩展BSGS (虽然AC,但完全理解不了模板0.0,以后学好数学在来慢慢理解555555) #include <iostream> #include <cstdio> #include <ctime> #include <cmath> const int MAXN = 1000 + 10; const int maxn = 65535; const int INF = 0x7fffffff; using na

【BZOJ1467/2480】Pku3243 clever Y/Spoj3105 Mod EXBSGS

[BZOJ1467/2480]Pku3243 clever Y/Spoj3105 Mod Description 已知数a,p,b,求满足a^x≡b(mod p)的最小自然数x. Input 每个测试文件中最多包含100组测试数据. 每组数据中,每行包含3个正整数a,p,b. 当a=p=b=0时,表示测试数据读入完全. Output 对于每组数据,输出一行. 如果无解,输出“No Solution”(不含引号),否则输出最小自然数解. Sample Input 5 58 33 2 4 3 0 0

poj 1061(扩展欧几里得)

青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 90299   Accepted: 16412 Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能

BSGS及扩展BSGS模板

BSGS #include <iostream>//poj2417 #include <cstring> #include <cstdio> #include <cmath> #include <algorithm> #define ll long long using namespace std; const int maxint=((1<<30)-1)*2+1; int A,B,C; struct Hashmap{ static