题目:http://acm.fzu.edu.cn/problem.php?pid=1493
题目大意:a^x = b (mod c) 已知abc,求x ( a,b,x < c
考点:小步大步攻击算法。
思路:要在[0,c]内求x,只能枚举,但是暴力的枚举肯定会超时, 于是我们做一个等价的替换, 下面是过程
///
Step 1 :令m = ceil(sqrt(c));
Step 2 :等价替换
Step 3 :j = 0 -> m 将(j,
Step 4 :i = 0 -> m 令temp = a ^ m ^ i mod c
其中temp,b, c都是已知的,可利用扩展欧几里德求解y
在HASH表中查找y是否存在, 若存在则x = i * m + HASH(y). j
Step 5 :若查找到了y, 这有解, 若查找不到, 则无解
上面做的等价替换,目的是把O(n)的时间复杂度降低到O( ).使得枚举的长度减少了一半
提交情况:time limit error 10次
收获:了解个小步大步攻击算法的思路,学会了按位与的hash方法(和取模时间一样)
经验:不能盲目编码,注意一些可以优化的地方。要理解每个过程的原理
AC code
#include <stdio.h>
#include <math.h>
#include <string.h>
#define MAXN 65535
#define I64 __int64
struct LINK{
}HASH_LINK[MAXN];
I64 head[MAXN], ad;
void clear(){
}
I64 hash(I64 n){
}
void insert(I64 j, I64 data){
}
I64 POWER_MOD(I64 a, I64 b, I64 c){
}
I64 Ext_Gcd(I64 a, I64 b, I64 &x, I64 &y){
}
I64 babystep_giantstep(I64 a, I64 b, I64 c){
}
int main(){
}