题目链接
思路:
设当前位置为x,每次洗牌之后,下一次的位置为:
2
x
m
o
d
(
n
+
1
)
2x mod(n+1)
2xmod(n+1)
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
using namespace std;
#define int long long
int Mod(int x,int mod){return (x%mod+mod)%mod;}
int qmi(int a,int b,int mod){int res=1;while(b){if(b&1)res=res*a%mod;a=a*a%mod;b>>=1;}return res%mod;}
int exgcd(int a,int b,int &x,int &y){if(!b){x=1,y=0;return a;}int res=exgcd(b,a%b,y,x);y-=a/b*x;return res;}
signed main()
{
int n,m,l,d,x,y;
cin>>n>>m>>l;
int a=qmi(2,m,n+1);
d=exgcd(a,n+1,x,y);
cout<<Mod(x*l/d,n+1)<<'\n';
}