1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #define ll long long
 5 using namespace std;
 6 ll n,m,l;
 7 void exgcd(ll a1,ll a2,ll &x,ll &y)
 8 {
 9     if(!a2)
10       {
11         x=1;
12         y=0;
13         return;
14       }
15     exgcd(a2,a1%a2,x,y);
16     ll t=x;
17     x=y;
18     y=t-a1/a2*y;
19 }
20 int main()
21 {
22     scanf("%lld%lld%lld",&n,&m,&l);
23     n++;
24     ll ans=1,k=2;
25     for(;m;)
26       {
27         if(m%2)
28           ans=(ans*k)%n;
29         k=k*k%n;
30         m/=2;
31       }
32     ll x,y;
33     exgcd(ans,n,x,y);
34     if(x<0)
35       x+=n;
36     printf("%lld\n",l*x%n);
37     return 0;
38 }

设Ci表明第i次洗牌后要求的牌在哪个位置,所以C0为答案,Cm=L。由题Ci=(Ci-1*2)mod (n+1)。所以Cm=2m*C0 mod (n+1),所以2m*C0+(n+1)*y=Cm

用exgcd解。

posted on 2016-03-18 06:14  xiyuedong  阅读(84)  评论(0编辑  收藏  举报