日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Discrete Logging hunnu10590 pku2417 fzu 1352 hit 1928 zoj 1898

發(fā)布時(shí)間:2023/12/31 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Discrete Logging hunnu10590 pku2417 fzu 1352 hit 1928 zoj 1898 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

以下轉(zhuǎn)自:http://hi.baidu.com/aekdycoin/blog/item/b317ca18bb24334942a9ad55.html

【普通Baby Step Giant Step】

【問題模型】
求解
A^x = B (mod C) 中 0 <= x < C 的解,C 為素?cái)?shù)

【思路】
我們可以做一個(gè)等價(jià)
x = i * m + j? ( 0 <= i < m, 0 <=j < m) m = Ceil ( sqrt( C) )
而這么分解的目的無非是為了轉(zhuǎn)化為:
(A^i)^m * A^j = B ( mod C)

之后做少許暴力的工作就可以解決問題:
(1) for i = 0 -> m, 插入Hash (i, A^i mod C)
(2) 枚舉 i ,對于每一個(gè)枚舉到的i,令? AA = (A^m)^i mod C
我們有
AA * A^j = B (mod C)
顯然AA,B,C均已知,而由于C為素?cái)?shù),那么(AA,C)無條件為1
于是對于這個(gè)模方程解的個(gè)數(shù)唯一(可以利用擴(kuò)展歐幾里得歐拉定理來求解)
那么對于得到的唯一解X,在Hash表中尋找,如果找到,則返回 i * m + j
注意:由于i從小到大的枚舉,而Hash表中存在的j必然是對于某個(gè)剩余系內(nèi)的元素X 是最小的(就是指標(biāo))
所以顯然此時(shí)就可以得到最小解


如果需要得到 x > 0的解,那么只需要在上面的步驟中判斷 當(dāng) i * m + j > 0 的時(shí)候才返回


到目前為止,以上的算法都不存在爭議,大家實(shí)現(xiàn)的代碼均相差不大。可見當(dāng)C為素?cái)?shù)的時(shí)候,此類離散對數(shù)的問題可以變得十分容易實(shí)現(xiàn)。

#include<stdio.h> #include<math.h> #include<stdlib.h> #define nmax 46341 #define LL long long typedef struct Num {int nnum;int ii; } Num; Num num[nmax]; int x, y; int cmp(const void *a, const void *b) {Num *n = (Num *) a;Num *m = (Num *) b;if (n->nnum > m->nnum) {return 1;}return -1; } int extend_gcd(int a, int b) {if (b == 0) {x = 1, y = 0;return a;}int d = extend_gcd(b, a % b);int tx = x;x = y;y = tx - a / b * y;return d; } int find_num(int x, int n) {int mid, left, right;left = 0, right = n + 1;while (left <= right) {mid = (left + right) >> 1;if (num[mid].nnum == x) {return num[mid].ii;} else if (num[mid].nnum > x) {right = mid - 1;} else {left = mid + 1;}}return -1; } int main() { #ifndef ONLINE_JUDGEfreopen("t.txt", "r", stdin);freopen("out.txt", "w", stdout); #endifLL ptemp, te;int i, j, pte, p, b, n, bb, temp;while (scanf("%d %d %d", &p, &b, &n) != EOF) {pte = (int) ((sqrt(p * 1.0) + 0.5));for (i = 0, ptemp = 1; i <= pte; i++) {num[i].nnum = (int) (ptemp);num[i].ii = i;ptemp = ptemp * b % p;}bb = num[pte].nnum;qsort(num, pte + 1, sizeof(num[0]), cmp);for (i = 0, ptemp = 1; i <= pte; i++) {temp = (int) (ptemp);extend_gcd(temp, p);te = (int) (x);te = te * n;te = te % p + p;x = (int) (te % p);j = find_num(x, pte);if (j != -1) {printf("%d\n", pte * i + j);break;}ptemp = ptemp * bb % p;}if (i > pte) {printf("ERROR\n");}}return 0; } hunnu 10590 fzu 1352 pku 2417 hit 1928 zoj 1898 ? /*
a^x=b (mod c) c is prime
*/
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
#define LL long long
#define nmax 46345
typedef struct num {
int ii, value;
} num;
num Num[nmax];
int x, y;
int cmp(const void *a, const void *b) {
num n = *(num *) a;
num m = *(num *) b;
return n.value - m.value;
}
void extend_gcd(int a, int b) {
int xx;
if (b == 0) {
x = 1, y = 0;
return;
}
extend_gcd(b, a % b);
xx = x;
x = y, y = xx - a / b * y;
}
int bfindNum(int key, int n) {
int left, right, mid;
left = 0, right = n;
while (left <= right) {
mid = (left + right) >> 1;
if (Num[mid].value == key) {
return Num[mid].ii;
} else if (Num[mid].value > key) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return -1;
}
void solve(int c, int a, int b) {
int i, j, te, aa;
LL temp, xx;
te = (int) (sqrt(c * 1.0) + 0.5);
for (i = 0, temp = 1 % c; i <= te; i++) {
Num[i].ii = i;
Num[i].value = (int) (temp);
temp = temp * a % c;
}
aa = Num[te].value;
qsort(Num, te + 1, sizeof(Num[0]), cmp);
for (i = 0, temp = 1; i <= te; i++) {
extend_gcd((int) (temp), c);
xx = (LL) x;
xx = xx * b;
xx = xx % c + c;
x = (int) (xx % c);
j = bfindNum(x, te + 1);
if (j != -1) {
printf("%d\n", i * te + j);
return;
}
temp = temp * aa % c;
}
puts("no solution");
}
int main() {
#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
#endif
int p, b, n;
while (~scanf("%d %d %d", &p, &b, &n)) {
solve(p, b, n);
}
return 0;
}

轉(zhuǎn)載于:https://www.cnblogs.com/xiaoxian1369/archive/2011/08/04/2127447.html

總結(jié)

以上是生活随笔為你收集整理的Discrete Logging hunnu10590 pku2417 fzu 1352 hit 1928 zoj 1898的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。