POJ 3243 // HDU 2815(改下输出,加个判断)
来源:互联网 发布:萧然网络问政瓜沥 编辑:程序博客网 时间:2024/06/14 07:17
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 namespace std;typedef long long ll;struct Hash{ ll a,b,next;}Hash[maxn << 1];ll flg[maxn + 66];ll top,idx;void ins(ll a,ll b){ ll k = b & maxn; if (flg[k] != idx){ flg[k] = idx; Hash[k].next = -1; Hash[k].a = a; Hash[k].b = b; return ; } while (Hash[k].next != -1){ if(Hash[k].b == b) return ; k = Hash[k].next; } Hash[k].next = ++ top; Hash[top].next = -1; Hash[top].a = a; Hash[top].b = b;}ll Find(ll b){ ll k = b & maxn; if (flg[k] != idx) return -1; while (k != -1){ if(Hash[k].b == b) return Hash[k].a; k = Hash[k].next; } return -1;}ll gcd(ll a,ll b) {return b == 0? a: gcd(b, a % b);}ll exgcd(ll a, ll b, ll &x, ll &y){ if (b == 0){x = 1; y = 0; return a;} ll tmp = exgcd(b, a % b, y, x); y -= x * (a / b); return tmp;}ll solve(ll a, ll b, ll c){ ll x, y, Ans; ll tmp = exgcd(a, c, x, y); Ans = (ll)(x * b) % c; return Ans >= 0 ? Ans : Ans + c;}ll pow(ll a, ll b, ll c){ ll ret = 1; while(b) { if(b & 1) ret = ret * a % c; a = a*a%c; b>>= 1; } return ret;}ll BSGS(ll A, ll B, ll C){ top = maxn; ++idx; ll buf = 1 % C, D = buf, K, tmp; for (ll i = 0; i <= 100; i++){ if (buf == B) return i; buf = (buf * A) % C; } ll d = 0; while ((tmp = gcd(A, C)) != 1){ if (B % tmp != 0) return -1; d++; B /= tmp; C /= tmp; D = D * A / tmp % C; } //hash表记录1-sqrt(c)的值 ll M = (ll)ceil(sqrt(C * 1.0)); buf = 1 % C; for (ll i = 0; i <= M; i++){ ins(i, buf); buf = (buf * A) % C; } K = pow(A, M, C); for (ll i = 0; i <= M; i++){ tmp = solve(D, B, C); ll w; if (tmp >= 0 && (w = Find(tmp)) != -1) return i * M + w + d; D = (D * K) % C; } return -1;}int main(){ ll A, B, C; while (cin >> A >> C >> B && (A || B || C)){ B %= C; ll tmp = BSGS(A, B, C); // A^x = B (mod C); if (tmp >= 0) cout << tmp << endl; else cout << "No Solution\n"; } return 0;}
0 0
- POJ 3243 // HDU 2815(改下输出,加个判断)
- POJ 1860 Bellman改判断正环
- 个人加快android studio编译速度(不改),加个ssd就不用看了- -
- 复杂的行列转换(列转置),加判断条件为输出状态
- 复杂的行列转换(列转置),加判断条件为输出状态
- hdu 1166 (改)
- 徐登沿的第二个程序(三位数的输出)(改正版)
- POJ-2184(背包 + 动态数组,给交流电加个直流偏执)
- [Shell]给linux命令tee输出文件加个时间
- hdu 1385 Minimum Transport Cost 最短路加路径输出
- (学习个输出方法)POJ 1929 Calories from Fat(没啥算法,就是比较复杂还有个输出问题)
- hdu 1558 并查集 加 判断线段相交
- HDU 2444 判断二分图加最大匹配
- HDU 1272 HDU 1308&&POJ 1308(树的判断)(并查集)
- HDU 6055-Regular polygon (判断n个整数点能够成多少个正多边形)
- 判断1-100之间有多少个素数并输出所有素数(方法的调用)
- 判断101-200之间有多少个素数,并输出所有素数(python实现)
- 题目:判断101-200之间有多少个素数,并输出所有素数。(java)
- HDU 5297
- POJ 2115
- HDU 1573
- HDU 3579
- Java代码优化--尽可能地使用stack(栈)变量(方法内部的局部变量)
- POJ 3243 // HDU 2815(改下输出,加个判断)
- MySQL5.7 Replication主从复制配置教程
- Codeforces Round #Pi (Div. 2) C
- HNU 2015暑期新队员训练赛2 B Combination
- HNU 2015暑期新队员训练赛2 H Blanket
- CF D. One-Dimensional Battle Ships
- LA 6893 矩阵HASH (模板)
- IOS 开发环境,证书和授权文件是什么?
- Fragment的使用(四)