CH0102_64位整数乘法
描述
求a乘b对p取模的值,其中1≤a,b,p≤10^18。
思路
一位一位地做乘法,从b的最高位开始取,如果是1就加a,一位一位地取模可以避免溢出。
解决
1 |
|
反思和坑
不能分治,因为模数也是1e18的,分治之后恢复数位也相当于一次高位乘法。
POJ1958_Strange Towers of Hanoi
描述
4根柱子的汉诺塔问题,要求输出n=1到12的最小移动次数。
思路
首先使用四柱模式移动k个盘子到B柱。
然后使用三柱模式移动n-k个盘子到D柱。
最后使用四柱模式移动k个盘子到D柱。
多柱汉诺塔问题都可以用类似的思路解决。
解决
1 |
|
CH0301_递归实现指数型枚举
描述
给出一个小于等于16的数n,求出在小于等于n的正整数中,任意地选取某些数字的所有选择方法。按照一定的顺序输出它们。如n=3,则输出:
1 |
|
思路
题目中是递归实现指数型枚举,实际上,一个集合的幂集中所有的元素可以对应到二进制数中,所以我并没有使用递归,而是直接使用二进制数+译码器的方式做出的。
解决
1 |
|
反思和坑
第一行居然表示空集要输出空行。
递归解法
1 |
|
CH0303_递归实现排列型枚举
描述
把1~n这n(n<10)个整数排成一行后随机打乱顺序,输出所有可能的次序
解决
1 |
|
CH0302_递归实现组合型枚举
描述
从1~n这n个整数中随机选出 m 个,输出所有可能的选择方案。n>0,0<=m<=n,n+(n-m)<=25。
思路
同0301,加一个限定条件即size是3,并且情况数逆序输出就行了。
解决
1 |
|
CH0201_费解的开关
描述
25盏灯排成一个5x5的方形。每一个灯都有一个开关,游戏者可以改变它的状态。每一步,游戏者可以改变某一个灯的状态。游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也要相应地改变其状态。
我们用数字“1”表示一盏开着的灯,用数字“0”表示关着的灯。
最终要得到所有灯都打开的状态,求所需要的最小操作数是多少?如果总共操作数大于6,则输出-1。
思路
必须看出这样的事实:
1、任意一个点最多操作一次,这很显然。
2、操作的先后顺序是任意的。
3、如果操作是一行一行地做的,可以发现固定一行之后,剩下的操作只能有一种。假设在第一行的操作都已经执行完毕,且第一行的灯状态是01100,那么显然第二行一定要点击1,4,5三个位置使得第一行的灯全亮。
所以,能改变的只有第一行的操作位置,最多有32种操作方法。
模拟或递归方法来做。
解决
1 |
|