[BZOJ1965][Ahoi2005]SHUFFLE 洗牌

来源:互联网 发布:java 1.7 特性 编辑:程序博客网 时间:2024/05/09 00:39

题意


一堆n张牌的牌堆,每次洗牌后编号为x的牌会在第2x%(n+1)的位置,求m次洗牌后第L张牌的初始编号。


可列出方程
    x2mL(mod n+1)
 x2m+(n+1)y=L

可以用拓展欧几里得解。

#include <cstdio>#define ll long longll n,m,l;ll Pw(ll x,ll y,ll p){    ll R=1;    while(y){        if(y&1) R=R*x%p;        x=x*x%p;        y>>=1;    }    return R;}ll exgcd(ll a,ll b,ll &x,ll &y){    if(b==0){x=1;y=0;return a;}    ll k=exgcd(b,a%b,x,y),t=x;    x=y;y=t-a/b*y;return k;}int main(){    scanf("%lld%lld%lld",&n,&m,&l);    ll a=Pw(2,m,n+1),b=n+1,x,y,g;    g=exgcd(a,b,x,y);    if(((x*=l/g)%=n+1)<=0) x+=n+1;    return printf("%lld",x);}
0 0
原创粉丝点击