BZOJ_1004 Cards

2015-05-16  本文已影响58人  Zhu8655

1.题目相关

2.思路


a·X1 + b·Y1 = gcd(a, b) b·X2 + (a % b)·Y2 = gcd(b, a % b)
其中
gcd(a, b) = gcd(b, a % b) a % b = a-(a/b)·b
整理可得
a·X1 + b·Y1 = b·X2 + (a-(a/b)·b)·Y2
a·X1 + b·Y1 = a·Y2 + b·[X2-(a/b)]·Y2
所以
X1 = Y2 , Y1 = X2-(a/b)·Y2

void exgcd(int a, int b, int &x, int &y) {
    if (b == 0) {x = 1; y = 0; return;}
    exgcd(b, a%b, x, y);
    int t = x; x = y; y = t-a/b*y;
}

根据
b·k ≡ 1 (mod p)
可得
b·k = p·x + 1
k = (p·x + 1) / b
把 k 代入
(a·k) mod p
得原式
= (a·(p·x + 1) / b) % p
= ((a·p·x)/b + a/b) % p
= [((a·p·x)/b) % p + (a/b)] mod p
所以原式等于
(a/b) % p

exgcd(b, p, k, y);
while (k <= 0) k += p;

点击查看代码

上一篇 下一篇

猜你喜欢

热点阅读