字数
400 字
阅读时间
3 分钟
原题:洗牌
题意
偶数的
即
后半部分先放,变成
给
要求求出洗完后的第
思路
手玩发现,当前扑克的位置
经过
通过[[扩展欧几里得]]的知识可以将上式转化为
类似于形式
由于
所以当求出
代码
由于范围问题,需要用int128,或者位运算乘法
CPP
#define i128 __int128_t
i128 d, x, y, px, py;
i128 n, m, l;
void exgcd(i128 a, i128 b) {
if (b == 0) {
d = a;
x = 1;
y = 0;
} else {
exgcd(b, a % b);
px = x;
py = y;
x = py;
y = px - (a / b) * py;
}
}
i128 ksm(i128 a, i128 b, i128 p) {
i128 res = 1;
while (b) {
if (b & 1) res = res * a % p;
a = a * a % p;
b >>= 1;
}
return res;
}
void print(i128 a, string s = "") {
string anss = "";
while (a) {
anss += a % 10 + '0';
a /= 10;
}
if (anss == "") anss = "0";
reverse(all(anss));
cout << anss << s;
}
signed main() {
IOS;
int nn, mm, ll;
cin >> nn >> mm >> ll;
n = nn;
m = mm;
l = ll;
i128 a = ksm(2, m, n + 1);
exgcd(a, n + 1);
x = (x % (n + 1) + (n + 1)) % (n + 1);
i128 ans = (x * l) % (n + 1);
print(ans);
return 0;
}