10710 - Chinese Shuffle(数论+完美洗牌)
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", n);
else
printf("%d is not a Jimmy-number\n", n);
}
return 0;
}
10710 - Chinese Shuffle(数论+完美洗牌)的更多相关文章
- uva 10710 - Chinese Shuffle(完美洗牌)
option=com_onlinejudge&Itemid=8&category=474&page=show_problem&problem=1651"> ...
- [转]完美洗牌(Perfect Shuffle)问题
[转]原博文地址:https://github.com/julycoding/The-Art-Of-Programming-By-July/blob/master/ebook/zh/02.09.md ...
- 完美洗牌&洗牌
完美洗牌问题,给定一个数组a1,a2,a3,...an,b1,b2,b3..bn,把它最终设置为b1,a1,b2,a2,...bn,an这样的. O(n)的算法,O(n)的空间. 对于前n个数,映射为 ...
- 算法笔记_128:完美洗牌算法(Java)
目录 1 问题描述 2 解决方案 2.1位置置换算法 2.2 走环算法 1 问题描述 有一个长度为2n的数组{a1,a2,a3,...,an,b1,b2,b3,...,bn},希望排序后变成{a1 ...
- Java实现完美洗牌算法
1 问题描述 有一个长度为2n的数组{a1,a2,a3,-,an,b1,b2,b3,-,bn},希望排序后变成{a1,b1,a2,b2,a3,b3,-,an,bn},请考虑有没有时间复杂度为O(n)而 ...
- 519. Random Flip Matrix(Fisher-Yates洗牌算法)
1. 问题 给定一个全零矩阵的行和列,实现flip函数随机把一个0变成1并返回索引,实现rest函数将所有数归零. 2. 思路 拒绝采样 (1)先计算矩阵的元素个数(行乘以列),记作n,那么[0, n ...
- 实现纸牌游戏的随机抽牌洗牌过程(item系列几个内置方法的实例)
实现纸牌游戏的随机抽牌洗牌过程(item系列几个内置方法的实例) 1.namedtuple:命名元组,可以创建一个没有方法只有属性的类 from collections import namedtup ...
- python 练习洗牌
生成随机数需要引入random模块,学习下random模块中常用的几个函数: random.random() 用于生成一个0到1的随机符点数: 0 <= n < 1.0 random.un ...
- BZOJ 1965: [Ahoi2005]SHUFFLE 洗牌( 数论 )
对于第x个数, 下一轮它会到位置p. 当x<=N/2, p = x*2 当x>N/2, p = x*2%(N+1) 所以p = x*2%(N+1) 设一开始的位置为t, 那么t*2M%(N ...
随机推荐
- java应用高内存占用
在java虚拟机中,内存分为三个代:新生代(New), 老生代(Old).永久代(Perm) 新生代: 新建的对象都存放这里老生代:存放从新生代中迁移过来的生命周期较久的对象.新生代和老生代共同组成了 ...
- 通用数据库管理工具DBeaver
通用数据库管理工具DBeaver 在渗透测试中,用户往往需要管理很多数据库.这些数据库可能是渗透软件使用的(如Metasploit使用的Postgresql),也有目标主机的数据库(如网站的数据库 ...
- java.lang.ClassCastException: com.sun.proxy.$Proxy13 cannot be cast to sm.dao.UserDao
在Spring中添加事物管理以后出现的问题 源代码 ApplicationContext applicationContext = new ClassPathXmlApplicationContext ...
- python3开发进阶-Django框架的ORM常用字段和参数
阅读目录 常用字段 字段合集 自定义字段 字段参数 关系参数 多对多的关联关系的三种方式 一.常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中 ...
- Bug Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stock error was
yum -y install gcc 时候报bug: Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7& ...
- iOS viewDidLoad 什么时候调用
- (void)viewDidLoad; // Called after the view has been loaded. For view controllers created in code, ...
- ajax变量作用域的问题
需求:使得一个变量在ajax内外都有作用域 方法:设置为同步请求 async:false
- 使用GIT进行源码管理 —— VisualStudio官方GIT教程
我之前在文章使用GIT进行源码管理 —— 在VisualStudio中使用GIT中简单的介绍了一下如何使用VS中自带的Git工具,今天发现MSDN上现在也有了非常完整的教程,感兴趣的朋友可以看一下: ...
- 怎么在VS2010中打开VS2013的项目
其实VS2010与VS2013上的sln文件没有本质的区别.打不开的原因是什么呢?其实原因很简单,两者开头的软件信息不同.因此造成低版本VS的不识别. VS2013版本vs.sln文件开头的软件信息: ...
- 简化调用Web Service
年前在客户那里做POC,因为成型的OTMCS暴露Web Service的Schema太长,导致ICS无法支持和映射,讨论过后决定对Web Service调用进行封装,因OTMCS WebService ...