zoukankan      html  css  js  c++  java
  • 10710

    UVA 10710 - Chinese Shuffle

    题目链接

    题意:给定n张牌,完美洗牌n - 1次,问是否会变回原来的序列

    思路:完美洗牌:
    如果有a1a2a3...anb1b2b3...bn的牌,设每张牌原来的位置为x,那么完美洗牌一次后。前n张牌分别到2 x位置,后n张分别到1, 3, 5..也就是2 x % (2 n + 1)的位置,因此每张牌位置变为2 x % (2 * n + 1).这样去推断每张牌是否到原位就能够得出答案了。可是牌非常多的情况根本无法推断。那怎么办呢?

    事实上仅仅要推断第一张就能够了,证明:
    如果完美洗牌p次,那么第一张牌位置为1 2^p % (2 n + 1) = 1,那么第x张牌的位置为x 2^p % (2 n + 1) = x就得得证了。

    在来考虑这题。这题给定的完美洗牌方式,那么事实上对于偶数就能够看成奇数的情况(由于第一张始终不变),然后和上面一样去推一下位置变化,最后得到每张牌的位置为x * 2^(n - 1) % n,这样一来带入1,问题就变成了推断2 ^ (n - 1) % n == 1,用高速幂就可以

    代码:

    #include <stdio.h>
    #include <string.h>
    
    long long n;
    
    long long pow_mod(long long x, long long k, long long mod) {
    	if (k == 0) return 1;
    	long long ans = pow_mod(x * x % mod, k>>1, mod);
    	if (k&1) ans = ans * x % mod;
    	return ans;
    }
    
    int main() {
    	while (~scanf("%lld", &n) && n != -1) {
    		if (pow_mod(2, n - 1, n) == 1)
    			printf("%d is a Jimmy-number
    ", n);
    		else
    			printf("%d is not a Jimmy-number
    ", n);
     	}
    	return 0;
    }


  • 相关阅读:
    luogu1196 银河英雄传说 (并查集)
    [BZOJ2243][SDOI2011]染色
    [BZOJ1879] [Sdoi2009]Bill的挑战
    [Noip2003] 侦探推理
    [Noip2005] 篝火晚会
    [JZOJ100047] 【NOIP2017提高A组模拟7.14】基因变异
    [九省联考2018]一双木棋chess
    [Noip2009] 靶形数独
    [Luogu2737] [USACO4.1]麦香牛块Beef McNuggets
    [BZOJ3109] [cqoi2013]新数独
  • 原文地址:https://www.cnblogs.com/jhcelue/p/7270417.html
Copyright © 2011-2022 走看看