【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 ",(x+(n+1))%(n+1)); 37 return 0; 38 }