LA 7457 Discrete Logarithm Problem

来源:互联网 发布:绘画人偶软件 编辑:程序博客网 时间:2024/06/06 00:32

题意:给你一个质数p (1 < p < 2^13), 让你求出 a^x = b (mod p) 的解(mod p), 如果无解,则输出0。

方法:暴力。

题目中也给了提示,说当p很大的时候,求离散对数是个难题,但是本题的p比较小,在(1<<13)以下,所以a的幂modulus p至多会有p-1个不同的值,准确的说,当gcd(a,p) == 1时,a的幂mod p有ord n (a) 个不同的值, ord n (a) 指 the multiplicative order of a mod n (https://en.wikipedia.org/wiki/Multiplicative_order)。

所以我们只需brute force计算a所有的power mod p,如果当前的power等于b则返回当前指数;否则,如果当前的幂为1(下面的code里是如果当前的幂之前得到过,效果类似),就直接返回0,表示无解。


code:

#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#include <string>#include <vector>#include <stack>#include <bitset>#include <cstdlib>#include <cmath>#include <set>#include <list>#include <deque>#include <map>#include <queue>#include <fstream>#include <cassert>#include <cmath>#include <sstream>#include <time.h>#include <complex>#define Max(a,b) ((a)>(b)?(a):(b))#define Min(a,b) ((a)<(b)?(a):(b))#define FOR(a,b,c) for (int (a)=(b);(a)<(c);++(a))#define FORN(a,b,c) for (int (a)=(b);(a)<=(c);++(a))#define DFOR(a,b,c) for (int (a)=(b);(a)>=(c);--(a))#define FORSQ(a,b,c) for (int (a)=(b);(a)*(a)<=(c);++(a))#define FORC(a,b,c) for (char (a)=(b);(a)<=(c);++(a))#define FOREACH(a,b) for (auto &(a) : (b))#define rep(i,n) FOR(i,0,n)#define repn(i,n) FORN(i,1,n)#define drep(i,n) DFOR(i,n-1,0)#define drepn(i,n) DFOR(i,n,1)#define MAX(a,b) a = Max(a,b)#define MIN(a,b) a = Min(a,b)#define SQR(x) ((LL)(x) * (x))#define Reset(a,b) memset(a,b,sizeof(a))#define fi first#define se second#define mp make_pair#define pb push_back#define all(v) v.begin(),v.end()#define ALLA(arr,sz) arr,arr+sz#define SIZE(v) (int)v.size()#define SORT(v) sort(all(v))#define REVERSE(v) reverse(ALL(v))#define SORTA(arr,sz) sort(ALLA(arr,sz))#define REVERSEA(arr,sz) reverse(ALLA(arr,sz))#define PERMUTE next_permutation#define TC(t) while(t--)#define forever for(;;)#define PINF 1000000000000#define newline '\n'#define test if(1)coutusing namespace std;using namespace std;typedef vector<int> vi;typedef vector<vi> vvi;typedef pair<int,int> ii;typedef pair<double,double> dd;typedef pair<char,char> cc;typedef vector<ii> vii;typedef long long ll;typedef unsigned long long ull;typedef pair<ll, ll> l4;const double pi = acos(-1.0);const int maxn = 1<<13;bitset<maxn> vis;int p;int solve(int a, int b){    vis.reset();    int result = 1;    for (int i = 1; i <= p-1; ++i)    {        result = result * a % p;        if (result == b)    return i;        if (vis[result])    break;        vis[result] = true;    }    return 0;}int main(){    cin >> p;    int a, b;    while (cin >> a && a)    {        cin >> b;        a %= p, b %= p;        cout << solve(a, b) << newline;    }}


0 0
原创粉丝点击