首页 > 其他 > 详细

bzoj 1965: [Ahoi2005]SHUFFLE 洗牌

时间:2016-03-18 07:08:30      阅读:222      评论:0      收藏:0      [点我收藏+]
 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解。

bzoj 1965: [Ahoi2005]SHUFFLE 洗牌

原文:http://www.cnblogs.com/xydddd/p/5290283.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!