【bzoj1965】: [Ahoi2005]SHUFFLE 洗牌 数论-快速幂-扩展欧几里得

【bzoj1965】: [Ahoi2005]SHUFFLE 洗牌

观察发现第x张牌

当x<=n/2 x=2x

当x>n/2 x=2x-n-1

好像就是 x=2x mod (n+1)

 就好了

 1 /* http://www.cnblogs.com/karl07/ */
 2 #include <cstdlib>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <cmath>
 6 #include <algorithm>
 7 using namespace std;
 8 #define LL long long
 9 
10 LL n,m,l,g,x,y;
11 
12 LL gcd(LL a,LL b){return !b ? a : gcd(b,a%b);}
13 
14 void ex_gcd(LL a,LL b,LL &x,LL &y){
15     if (b==0){x=1; y=0; return;}
16     ex_gcd(b,a%b,y,x);
17     y-=x*(a/b);
18 }
19 
20 LL Q_pow(LL x,LL y){
21     LL ans=1;
22     while(y){
23         if (y&1) ans=ans*x%(n+1);
24         x=x*x%(n+1);
25         y=(y>>1);
26     }
27     return ans;
28 }
29 
30 int main(){
31     scanf("%lld%lld%lld",&n,&m,&l);
32     m=Q_pow(2,m);
33     g=gcd(n+1,m);
34     ex_gcd(m/g,(n+1)/g,x,y);
35     x=x*(l/g)%(n+1);
36     printf("%lld\n",(x+(n+1))%(n+1));
37     return 0;
38 }
View Code

 

posted @ 2017-03-19 20:57  karl07  阅读(190)  评论(0编辑  收藏  举报