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张扑克牌的牌面大小是多少的科学家得胜。小联想赢取游戏的胜利,你能帮助他吗?

    输入

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

    输出

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

    样例输入

    6 2 3

    样例输出

    6


    题解

    欧拉定理

    由题意,第i张牌洗牌后的位置是2i mod (n+1)。

    那么原题就是要求$2^m·xequiv l (mod (n+1))$的最小正整数解 。

    直接使用乘法逆元将$2^m$除过去即可。

    注意到$2^m$与$n+1$一定是互质的,因此由欧拉定理$a^{varphi(p)}equiv 1 (mod p)$,可以求得$2^m$的逆元为$(2^m)^{varphi(n+1)-1}$。

    求一下欧拉函数并使用快速幂求解即可。

    当然好像还有更快但是更麻烦的EXgcd算法

    由于两个大数相乘会爆long long,因此还要使用快(man)速乘

    #include <cstdio>
    #include <algorithm>
    using namespace std;
    typedef long long ll;
    ll mul(ll x , ll y , ll mod)
    {
    	ll ans = 0;
    	while(y)
    	{
    		if(y & 1) ans = (ans + x) % mod;
    		x = (x + x) % mod , y >>= 1;
    	}
    	return ans;
    }
    ll pow(ll x , ll y , ll mod)
    {
    	ll ans = 1;
    	while(y)
    	{
    		if(y & 1) ans = mul(ans , x , mod);
    		x = mul(x , x , mod) , y >>= 1;
    	}
    	return ans;
    }
    ll phi(ll x)
    {
    	ll ans = x , i;
    	for(i = 2 ; i * i <= x ; i ++ )
    	{
    		if(x % i == 0)
    		{
    			ans = ans / i * (i - 1);
    			while(x % i == 0) x /= i;
    		}
    	}
    	if(x > 1) ans = ans / x * (x - 1);
    	return ans;
    }
    int main()
    {
    	ll n , m , l;
    	scanf("%lld%lld%lld" , &n , &m , &l);
    	printf("%lld
    " , mul(pow(pow(2 , m , n + 1) , phi(n + 1) - 1 , n + 1) , l , n + 1));
    	return 0;
    }
    

     

  • 相关阅读:
    C++ 将对象写入文件 并读取
    IronPython fail to add reference to WebDriver.dll
    How to Capture and Decrypt Lync Server 2010 TLS Traffic Using Microsoft Tools
    .net code injection
    数学系学生应该知道的十个学术网站
    Difference Between Currency Swap and FX Swap
    Swift开源parser
    谈谈我对证券公司一些部门的理解(前、中、后台)[z]
    JDK8记FullGC时候Metaspace内存不会被垃圾回收
    JVM源码分析之JDK8下的僵尸(无法回收)类加载器[z]
  • 原文地址:https://www.cnblogs.com/GXZlegend/p/7072646.html
Copyright © 2011-2022 走看看