zoukankan      html  css  js  c++  java
  • 【bzoj1965】[Ahoi2005]SHUFFLE 洗牌

     为了表彰小联为Samuel星球的探险所做出的贡献,小联被邀请参加Samuel星球近距离载人探险活动。 由于Samuel星球相当遥远,科学家们要在飞船中度过相当长的一段时间,小联提议用扑克牌打发长途旅行中的无聊时间。玩了几局之后,大家觉得单纯玩扑克牌对于像他们这样的高智商人才来说太简单了。有人提出了扑克牌的一种新的玩法。 对于扑克牌的一次洗牌是这样定义的,将一叠N(N为偶数)张扑克牌平均分成上下两叠,取下面一叠的第一张作为新的一叠的第一张,然后取上面一叠的第一张作为新的一叠的第二张,再取下面一叠的第二张作为新的一叠的第三张……如此交替直到所有的牌取完。 如果对一叠6张的扑克牌1 2 3 4 5 6,进行一次洗牌的过程如下图所示:  从图中可以看出经过一次洗牌,序列1 2 3 4 5 6变为4 1 5 2 6 3。当然,再对得到的序列进行一次洗牌,又会变为2 4 6 1 3 5。 游戏是这样的,如果给定长度为N的一叠扑克牌,并且牌面大小从1开始连续增加到N(不考虑花色),对这样的一叠扑克牌,进行M次洗牌。最先说出经过洗牌后的扑克牌序列中第L张扑克牌的牌面大小是多少的科学家得胜。小联想赢取游戏的胜利,你能帮助他吗?

    Input

    有三个用空格间隔的整数,分别表示N,M,L (其中0< N ≤ 10 ^ 10 ,0 ≤ M ≤ 10^ 10,且N为偶数)。

    Output

    单行输出指定的扑克牌的牌面大小。

    Sample Input

    6 2 3

    Sample Output

    6
    x(2m)l(mod n+1)x∗(2m)≡l(mod n+1)

    x在mod n+1下逆元是n/2+1

    所以移项得

    x(n/2+1)ml(mod n+1)
    #include<cstdio>
    #include<cstdlib>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #define ll long long
    using namespace std;
    
    ll n,m,l;
    
    ll pow(ll x,ll y,ll z)
    {
        ll ans=1;x%=z;
        while(y)
        {
            if(y&1) ans=(ans*x)%z;
            x=(x*x)%z;
            y>>=1;
        }
        return ans;
    }
    ll exgcd(ll a,ll b,ll &x,ll &y)
    {
        if (!b)
        {
        	x=1,y=0;
        	return a;
    	}
    	else
    	{
    		ll fzy=exgcd(b,a%b,x,y);
    		ll t=x;x=y,y=t-a/b*y;
    		return fzy;
    	}
    }
    int main()
    {
        scanf("%lld%lld%lld",&n,&m,&l);
        n++;ll a=pow(2,m,n),b=n,x1,y1,g;
        g=exgcd(a,b,x1,y1);
        printf("%lld
    ",(x1*(l/g)%(n/g)+(n/g))%(n/g));
    }
    

      

  • 相关阅读:
    Java 实现 蓝桥杯 生兔子问题
    Java实现 蓝桥杯 基因牛的繁殖
    Java实现 蓝桥杯 基因牛的繁殖
    Java实现 蓝桥杯 基因牛的繁殖
    Java实现 LeetCode 33 搜索旋转排序数组
    Java实现 LeetCode 33 搜索旋转排序数组
    Java实现 LeetCode 33 搜索旋转排序数组
    深入探究VC —— 资源编译器rc.exe(3)
    深入探究VC —— 编译器cl.exe(2)
    深入探究VC —— 编译器cl.exe(1)
  • 原文地址:https://www.cnblogs.com/fengzhiyuan/p/7766154.html
Copyright © 2011-2022 走看看