bzoj 1965 [Ahoi2005]SHUFFLE 洗牌 数学
Posted copperoxide
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj 1965 [Ahoi2005]SHUFFLE 洗牌 数学相关的知识,希望对你有一定的参考价值。
题面
解法
可以发现,位置为(x)的经过一次操作后就会变成(2x mod (n+1))
然后就变成(x×2^mequiv k(mod n+1))
然后求一个逆元即可
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, m, k, p;
int Pow(int x, int y) {
int ret = 1;
while (y) {
if (y & 1) ret = ret * x % p;
y >>= 1, x = x * x % p;
}
return ret;
}
void calc(int a, int b, int &x, int &y) {
if (b == 0) {x = 1, y = 0; return;}
int r = a % b, q = a / b;
calc(b, r, y, x);
y -= x * q;
}
main() {
cin >> n >> m >> k; p = n + 1;
int a = Pow(2, m), tx, ty;
calc(a, p, tx, ty);
tx = (tx % p + p) % p;
cout << k * tx % p << "
";
return 0;
}
以上是关于bzoj 1965 [Ahoi2005]SHUFFLE 洗牌 数学的主要内容,如果未能解决你的问题,请参考以下文章
bzoj1965[Ahoi2005]SHUFFLE 洗牌 - 快速幂
bzoj1965 [Ahoi2005]SHUFFLE 洗牌 欧拉定理