標籤:style blog http color get 2014
UVA 10710 - Chinese Shuffle
題目連結
題意:給定n張牌,完美洗牌n - 1次,問是否會變回原來的序列
思路:完美洗牌:
假設有a1a2a3...anb1b2b3...bn的牌,設每張牌原來的位置為x,那麼完美洗牌一次後,前n張牌分別到2 x位置,後n張分別到1, 3, 5..也就是2x % (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", n);elseprintf("%d is not a Jimmy-number\n", n); }return 0;}