题意
一堆n张牌的牌堆,每次洗牌后编号为
x
的牌会在第
可列出方程
x∗2m≡L(mod n+1)
∴ x∗2m+(n+1)y=L
可以用拓展欧几里得解。
#include <cstdio>
#define ll long long
ll 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);
}