[BZOJ1965][Ahoi2005]SHUFFLE 洗牌 数学公式+乘法逆元

来源:互联网 发布:mongodb 删除数据库 编辑:程序博客网 时间:2024/05/20 07:53

天呐太弱啦
首先我们很容易就能得到一个公式
若i为偶数,F[i]=G[i/2]
否则,F[i]=G[(n+i+1)/2]

观察可得,i在下一轮洗牌的位置可以表示为
(2×i)mod(n+1)
设答案为x,则有方程
x×2ml
求逆元后移项求解x即可

#include <iostream>#include <cstdio>using namespace std;typedef long long LL;LL n,m,l;LL ex_gcd(LL a,LL &x,LL b,LL &y) {    if (!b) {x=1;y=0;return 1;}    LL p = ex_gcd(b,y,a%b,x);    y-=a/b*x; if (y<0) y+=n+1;    return p; }LL qp(LL a,LL b) {    LL r = 1;    while (b) {        if (b&1) r = (r*a) % (n+1);        a=a*a%(n+1); b>>=1;    }    return r;}int main(){    cin >> n >> m >> l;    LL e,y; ex_gcd(2,e,n+1,y);    LL ans = (l*qp(e,m)) % (n+1);     cout << ans << endl;    return 0;}
0 0
原创粉丝点击