zoukankan      html  css  js  c++  java
  • bzoj 1965: [Ahoi2005]SHUFFLE 洗牌

     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
    ",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解。

  • 相关阅读:
    软件测试:Homework 3
    软件测试:Lab 1
    软件测试:Homework 2
    软件测试:Homework 1
    JAVA的回忆
    Java 操作符
    Java 笔录
    经典C#编程理解,概要,经典
    网络精灵
    签到计时
  • 原文地址:https://www.cnblogs.com/xydddd/p/5290283.html
Copyright © 2011-2022 走看看