10.5 训练参考
数学题目的特点是:思维难度往往远大于编程难度。尽管如此,也有一些程序实现细节不容忽视,例如,整数溢出和精度误差。本章的例题很多,不过多数题目的难度不大,重点在于帮助读者巩固相关的知识点。建议读者先学会所有不加星号的例题,然后逐步弄懂有星号的例题。本章例题列表如表10-6所示。
表10-6 例题列表
| 类别 | 题号 | 题目名称(英文) | 备注 |
| 例题10-1 | UVa11582 | Colossal Fibonacci Numbers! | 模算术 |
| 例题10-2 | UVa12169 | Disgruntled Judge | 模算术 |
| 例题10-3 | UVa10375 | Choose and Divide | 唯一分解定理 |
| 例题10-4 | UVa10791 | Minimum Sum LCM | 唯一分解定理 |
| 例题10-5 | UVa12716 | GCD XOR | 数论 |
| 例题10-6 | UVa1635 | Irrelevant Elements | 组合数 |
| 例题10-7 | UVa10820 | Send a Table | 欧拉phi函数 |
| 例题10-8 | UVa1262 | Password | 编码解码问题 |
| 例题10-9 | UVa1636 | Headshot | 离散概率 |
| 例题10-10 | UVa10491 | Cows and Cars | 离散概率 |
| 例题10-11 | UVa11181 | Probability|Given | 离散条件概率 |
| 例题10-12 | UVa1637 | Double Patience | 离散概率 |
| 例题10-13 | UVa580 | Critical Mass | 递推 |
| 例题10-14 | UVa12034 | Race | 递推 |
| *例题10-15 | UVa1638 | Pole Arrangement | 递推 |
| 例题10-16 | UVa12230 | Crossing Rivers | 数学期望 |
| 例题10-17 | UVa1639 | Candy | 数学期望 |
| 例题10-18 | UVa10288 | Coupons | 数学期望 |
| *例题10-19 | UVa11346 | Probability | 连续概率 |
| *例题10-20 | UVa10900 | So you want to be a 2n -aire? | 连续概率,数学期望 |
| *例题10-21 | UVa11971 | Polygon | 连续概率 |
| 例题10-22 | UVa1640 | The Counting Problem | 数位统计 |
| 例题10-23 | UVa10213 | How Many Pieces of Land? | 欧拉公式、计数 |
| 例题10-24 | UVa1641 | ASCII Area | 多边形面积 |
| 例题10-25 | UVa1363 | Joseph's Problem | 数论,数列求和 |
| *例题10-26 | UVa11440 | Help Mr. Tomisu | 欧拉phi函数 |
| 例题10-27 | UVa10214 | Trees in a Wood | 欧拉phi函数 |
| 例题10-28 | UVa1393 | Highway | 分类统计 |
| 例题10-29 | UVa1642 | Magical GCD | 综合题 |
本章的习题是本书中数量最多的,不过多数习题的难度不大,主要目的是巩固知识。因为大多数题目的描述比较简单,建议读者阅读所有题目,并选择感兴趣的题目思考。
习题10-1 砌砖(Add Bricks in the Wall, UVa11040)
45块石头按照如图10-17所示的方式排列,每块石头上有一个整数。
图10-17 45块石头排列方式
除了最后一行外,每个石头上的整数等于支撑它的两个石头上的整数之和。目前只有奇数行的左数奇数个位置上的数已知,你的任务是求出其余所有整数。输入保证有唯一解。
习题10-2 勤劳的蜜蜂(Bee Breeding, ACM/ICPC World Finals 1999, UVa808)
如图10-18所示,输入两个格子的编号a和b(a,b≤10000),求最短距离。例如,19和30的距离为5(一条最短路是19-7-6-5-15-30)。
习题10-3 角度和正方形(Angles and Squares, ACM/ICPC Beijing 2005, UVa1643)
如图10-19所示,第一象限里有一个角,把n(n≤10)个给定边长的正方形摆在这个角里(角度任意),使得阴影部分面积尽量大。
| ![]() |
| 图10-18 勤劳的蜜蜂问题示意图 | 图10-19 角度和正方形问题示意图 |
习题10-4 素数间隔(Prime Gap, ACM/ICPC Japan 2007, UVa1644)
输入一个整数n,求它后一个素数和前一个素数的差值。输入是素数时输出0。n不超过1299709(第100000个素数)。例如,n=27时输出29-23=6。
习题10-5 不同素数之和(Sum of Different Primes, ACM/ICPC Yokohama 2006, UVa1213)
选择K个质数,使它们的和等于N。给出N和K(N≤1120,K≤14),问有多少种满足条件的方案?例如,n=24,k=2时有3种方案:5+19=7+17=11+13=24。注意,1不是素数,因此n=k=1时答案为0。
习题10-6 连续素数之和(Sum of Consecutive Prime Numbers, ACM/ICPC Japan 2005, UVa1210)
输入整数n(2≤n≤10000),有多少种方案可以把n写成若干个连续素数之和?例如,41可由3种方案:2+3+5+7+11+13,11+13+17和41写成。
习题10-7 几乎是素数(Almost Prime Numbers, UVa10539)
输入两个正整数L、U(L≤U<1012),统计区间[L,U]的整数中有多少个数满足:它本身不是素数,但只有一个素因子。例如,4、27都满足条件。
习题10-8 完全P次方数(Perfect Pth Powers, UVa10622)
对于整数x,如果存在整数b使得x=bp,则说x是一个完全p次方数。输入整数n,求出最大的整数p,使得n是完全p次方数。n的绝对值不小于2,且n在32位带符号整数范围内。例如,n=17,p=1;n=1073741824,p=30;n=25,p=2。
习题10-9 约数(Divisors, UVa294)
输入两个整数L、U(1≤L≤U≤109,U-L≤10000),统计区间[L,U]的整数中哪一个的正约数最多。如果有多个,输出最小值。
习题10-10 统计有根树(Count, Chengdu 2012, UVa1645)
输入n(n≤1000),统计有多少个n结点的有根树,使得每个深度中所有结点的子结点数相同。例如,n=4时有3棵,如图10-20所示;n=7时有10棵。输出数目除以109+7的余数。
图10-20 n=4时的有根树
习题10-11 圈图的匹配(Edge Case, ACM/ICPC NWERC 2012, UVa1646)
n(3≤n≤10000)个结点组成一个圈,求匹配(即没有公共点的边集)的个数。例如,n=4时有7个,如图10-21所示,n=100时有792070839848372253127个。
图10-21 n=4时匹配的个数
习题10-12 汉堡(Burger, UVa557)
有n个牛肉堡和n个鸡肉堡给2n个孩子吃。每个孩子在吃之前都要抛硬币,正面吃牛肉煲,反面吃鸡肉煲。如果剩下的所有汉堡都一样,则不用抛硬币。求最后两个孩子吃到相同汉堡的概率。
习题10-13 H(n)(H(n), UVa11526)
输入n(在32位带符号整数范围内),计算下面C++函数的返回值:
long long H(int n){
long long res = 0;
for( int i = 1; i <= n; i=i+1 ){
res = (res + n/i);
}
return res;
}
例如,n=5、10时答案分别为10和27。
习题10-14 标准差(Standard Deviation, UVa10886)
下面是一个随机数发生器。输入seed的初始值,你的任务是求出它得到的前n个随机数标准差,保留小数点后5位(1≤n≤10000000,0≤seed<264)。
unsigned long long seed;
long double gen()
{
static const long double Z = ( long double )1.0 / (1LL<<32);
seed >>= 16;
seed &= ( 1ULL << 32 ) - 1;
seed *= seed;
return seed * Z;
}
习题10-15 零和一(Zeros and Ones, ACM/ICPC Dhaka 2004, UVa12063)
给出n、k(n≤64,k≤100),有多少个n位(无前导0)二进制数的1和0一样多,且值为k的倍数?
习题10-16 计算机变换(Computer Transformations, ACM/ICPC SEERC 2005, UVa1647)
初始串为一个1,每一步会将每个0改成10,每个1改成01,因此1会依次变成01, 1001, 01101001,…输入n(n≤1000),统计n步之后得到的串中,“00”这样的连续两个0出现了多少次。
习题10-17 H-半素数(Semi-prime H-numbers, UVa11105)
所有形如4n+1(n为非负整数)的数叫H数。定义1是唯一的单位H数,H素数是指本身不是1,且不能写成两个不是1的H数的乘积。H-半素数是指能写成两个H素数的乘积的H数(这两个数可以相同也可以不同)。例如,25是H-半素数,但125不是。
输入一个H数h(h≤1000001),输出1~h之间有多少个H-半素数。
习题10-18 一个研究课题(A Research Problem, UVa10837)
输入正整数m(m≤108),求最小的正整数n,使得φ(n)=m。输入保证n小于200000000。
习题10-19 蹦极(Bungee Jumping, UVa10868)
James Bond为了摆脱敌人的追击,逃到了一座桥前。桥上正好有一条蹦极绳,于是他打算把它拴到腿上,纵身跳下桥,落地后切断绳子,继续逃生。已知绳子的正常长度为l,Bond的体重为w,桥的高度为s,你的任务是替James Bond判断能否用这种方法逃生。
当从桥上跳下后,绳子绷紧前Bond将做自由落体运动(重力按9.81w计),而绷紧后绳子会有向上的拉力,大小为k*Δl,其中Δl为绳子当前长度和正常长度之差。当且仅当Bond可以到达地面,且落地速度不超过10米/秒时,才认为他安全着落。
输入每组数据包含4个非负整数k, l, s, w(s<200)。对于每组数据,如果可以安全着地,输出“James Bond survices.”,如果到不了地面,输出“Stuck in the air.”,如果到达地面速度太快,输出“Killed by the impact.”
习题10-20 商业中心(Business Center, NEERC 2009, UVa1648)
商业中心是一幢无限高的大楼。在一楼有m座电梯,每座电梯只有两个键:上、下。对于第i座电梯,每按一次“上”会往上走ui层楼,每按一次“下”会往下走di层楼。你的任务是从一楼开始选一个电梯,恰好按n次按钮,到达一个尽量低(一楼除外)的楼层。中途不能换乘电梯。1≤n≤1000000, 1≤m≤2000,1≤ui,di≤1000。
习题10-21 二项式系数(Binomial coefficients, ACM/ICPC NWERC 2011, UVa1649)
输入m(2≤m≤1015),求所有的(n,k)使得C(n,k)=m。输出按照n升序排列,当n相同时k按升序排列。
习题10-22 飞机环球(Planes Around the World, UVa10640)
有一种飞机,加满油能环游地球a/b圈。如果要使得一架飞机能够环游地球一圈,那么必须要使用其他若干架同种飞机,在某处为它空中加油。
假设a = 1,b = 2,5架飞机可以环游。
首先3架飞机一起从A走到C,飞机3给另外两架加满油,然后开始返程。当飞机1和2到达D的同时飞机3回到A。然后飞机2给飞机1加满油,回到A点。
接下来,飞机4和5逆时针出发,其中飞机4在F处等待,飞机5在E处等待,直到飞机1到达E。然后飞机5给飞机1加油,使得二者都能恰好飞到F。然后飞机4给飞机1和飞机5加油,三者都恰好飞回A,如图10-22所示。
图10-22 飞机环球问题示意图
假设:
输入a、b,输出最少需要时用多少架飞机才能完成环游地球。例如a = 1,b = 2时需要5架。无解输出-1。
习题10-23 Hendrie序列(Hendrie Sequence, UVa10479)
Hendrie序列是一个自描述序列,定义如下:
因此,H序列的前几项为:0,1,0,2,1,0,0,3,0,2,1,1,0,0,0,4,1,0,0,3,0,……输入正整数n(n<263),求H(n)。
习题10-24 幂之和(Sum of Powers, UVa766)
对于正整数k,可以定义k次方和:
可以把它写成下面的形式。当M取最小可能的正整数时,所有系数ai都是确定的。
输入k(0≤k≤20),输出
。例如,k=2,输出6, 2, 3, 1, 0。
习题10-25 因子(Factors, ACM/ICPC World Finals 2013, UVa1575)
算术基本定理:每一个大于1的正整数都有唯一的方式写成若干个素数的乘积。不过如果允许把这些素数重排,就有多种表示方式:
10 = 2 * 5 = 5 * 2, 20 = 2 * 2 * 5 = 2 * 5 * 2 = 5 * 2 * 2
令f(k)为正整数k的写法个数,如f(10)=2,f(20)=3。对于正整数n,可以证明一定有整数k使得f(k)=n。你的任务是求出最小的k。n<263。
习题10-26 方形花园(Square Garden, UVa12520)
在L*L(L≤106)网格里涂色n(n≤L2)个格子,要求涂色格子的轮廓线周长尽量大。例如,图10-22中为L=3,n=8的两组解,图10-23(a)的周长为16,图10-23(b)的周长为12。
| ![]() |
| (a) | (b) |
图10-23 L=3,n=8的两组解
习题10-27 互联(Interconnect, ACM/ICPC NEERC 2006, UVa1390)
输入n个点m条边的无向图G(n≤30,m≤1000)。每次随机加一条非自环的边(u, v)(加完后可以出现重边)。添加每条边的概率是相等的,求使G连通的期望操作次数。
习题10-28 数字串(Number String, ACM/ICPC Changchun 2011, UVa1650)
每个排列都可以算出一个特征,即从第二个数开始每个数和前面一个数相比是增加(I)还是减少(D)。例如,{3,1,2,7,4,6,5}的特征是DIIDID。输入一个长度为n-1(2≤n≤1001)的字符串(包含字符I, D和?),统计1~n有多少个排列的特征和它匹配(其中?表示I和D都符合)。输出答案除以1000000007的余数。
习题10-29 名次表的变化(Fantasy Cricket, UVa11982)
如图10-24所示为一个足球比赛的名次表,给出了每个队伍相对上一轮的排名变化。例如:
图10-24 足球比赛名次表
这代表队伍A的名次提高了,B降低了,C提高了,D降低了。用U表示排名上升,D表示降低,E表示不变,则上表可以用UDUD表示。经过计算可知,上一轮的名次表有两种可能:BADC和BDAC(假定本轮和上一轮的名次都没有并列)。
输入这样一个UDE组成的序列(长度不超过1000),求上一轮名次有多少种可能。输出答案除以109+7的余数。
习题10-30 守卫(Guard, ACM/ICPC Dhaka 2011, UVa12371)
在n*n棋盘上放2n个守卫,使得每行每列均恰好有两个守卫,且一个格子里最多只有一个守卫。如图10-25所示是两种方法,其中图10-25(a)的守卫形成一个大圈,图10-25(b)中形成两个小圈。
|
|
| (a) | (b) |
图10-25 两种守卫方法
输入n、k(2≤n≤105,1≤k≤min(n,50)),输出恰好包含k个圈的方案总数。例如,n=2,k=1答案为1;n=3,k=1,答案为6;n=4,k=1,答案为72;n=4,k=2,答案为18。
习题10-31 守卫II(Guards II, ACM/ICPC Dhaka 2012, UVa12590)
在n行m列的棋盘里放k个车,使得边界格子都被攻击到。输出方案总数除以109+7的余数。n,m,k≤100。输入最多包含20000组数据。
习题10-32 汉诺塔(Hanoi Towers, ACM/ICPC NEERC 2007, UVa1414)
Hanoi塔问题有一种构造解法:把6种移动(AB,AC,BA,BC,CA,CB)排序后选择第一个能用的操作,前提是不能连续移动同一个盘子。给出n(n≤30)和6种移动的顺序,求解Hanoi问题的步数。最终所有盘子可以都在B也可以都在C。例如,对于n=2,排序为AB, BA, CA, BC, CB, AC,一共需要5步。
习题10-33 二元运算(Binary Operation, ACM/ICPC NEERC 2010, UVa1651)
给定正整数a≤b,你的任务是计算
的值,其中
的计算方法是这样的:首先,如果a和b的位数不同,位数较少的一个前面补0;然后逐位执行⊙操作。例如,当⊙表示“加起来模10”时,
的计算方法如下:
操作符
是左结合的,因此
从左到右计算即可。
输入⊙的运算表(一个10*10矩阵,表示0⊙0, 0⊙1,…, 9⊙9的结果,其中0⊙0保证为0)和a, b(0≤a≤b≤1018)的值,输出所求结果。
习题10-34 记住密码(Password Remembering, ACM/ICPC Dhaka 2009, UVa12212)
输入正整数A、B(A≤B<264),求有多少个整数n满足:n在A和B之间(即A≤n≤B),且n翻转之后也在A和B之间。1203翻转以后为3021,1050翻转以后是501。
习题10-35 Fibonacci单词(Fibonacci Word, ACM/ICPC World Finals 2012, UVa1282)
输入非空01串p和n(0≤n≤100),求p在F(n)中出现几次。p的长度不超过100000。
习题10-36 Fibonacci进制(Fibonacci System, ACM/ICPC NEERC 2008, UVa1652)
每个正整数都可以写成
,其中an=1,Fi就是第i个Fibonacci数
,然后用
作为N的Fibonacci进制表示。规定不能出现两个连续的1。例如,1~7的Fibonacci进制表示分别为:1, 10, 100, 101, 1000, 1001, 1010。
把所有自然数的Fibonacci进制表示拼起来,会得到一个长长的串110100101100010011010…。输入n n(n≤1015),统计前n位有多少个1。
习题10-37 倍数问题(Yet Another Multiple Problem, Chengdu 2012, UVa1653)
输入一个整数n(1≤n≤10000)和m个十进制数字,找n的最小倍数,其十进制表示中不含这m个数字中的任何一个。
提示:需要建一张图,结点i代表除以n的余数等于i。巧妙地利用第6章学过的BFS树可以简洁地解决这个问题。
习题10-38 正多边形(Regular Polygon, UVa10824)
给出圆周上的n(n≤2000)个点,选出其中的若干个组成一个正多形,有多少种方法?输出每行包含两个整数S和F,表示有F种选法得到正S边形。各行应按S从小到大排序。
习题10-39 圆周上的三角形(Circum Triangle, UVa11186)
在一个圆周上有n(n≤500)个点。不难证明,其中任意3个点都不共线,因此都可以组成一个三角形。求这些三角形的面积之和。
习题10-40 实验法计算概率(Probability Through Experiments, ACM/ICPC Hatyai 2012, UVa12535)
输入圆的半径和圆上n(n≤20000)个点的极角,任选3点能组成多少个锐角三角形?
习题10-41 整数序列(A Sequence of Numbers, ACM/ICPC Chengdu 2007, UVa1406)
输入n个整数,执行Q个操作(n≤105,Q≤200000)。有两种操作:
习题10-42 网格中的三角形(Triangles in the Grid, UVa12508)
一个n行m列的网格有n+1条横线和m+1条竖线。任选3个点,可以组成很多三角形。其中有多少个三角形的面积位于闭区间[A,B]内?1≤n,m≤200,0≤A<B≤nm。
习题10-43 整数对(Pair of Integers, ACM/ICPC NEERC 2001, UVa1654)
考虑一个不含前导0的正整数X,把它去掉一个数字以后得到另外一个数Y。输入X+Y的值N(1≤N≤109),输出所有可能的等式X+Y=N。例如,N=34有两个解:31+3=34;27+7=34。
习题10-44 选整数(K-Multiple Free Set, UVa11246)
给定正整数k,从1~n的整数中选出尽量多的整数,使得没有一个整数是另一个整数的k倍。例如,n=10,k=2,最多可以选6个:1,3,4,5,7,9。1≤n≤109,2≤k≤100。
习题10-45 带符号二进制(Power Signs, UVa11166)
每个整数都可以写成二进制。现将二进制变一下:每个数位上可以是0和1,还可以是-1。例如,13可以写成(1,0,0,-1,-1)=24-21-20。在这种进位制下,正整数的表示方法不唯一,例如,7可以写成(1,1,1)或者(1,0,0,-1)。你的任务是找一种非0数字最少的表示法。
输入每组数据第一行为用二进制表示的正整数n(n≤25000),保证不含前导0。对于每组数据,输出非0数字最小的表示法(0表示0,+表示1,-表示-1)。如果有多解,输出字典序最小的。
习题10-46 抽奖(Honorary Tickets, UVa11895)
在一次抽奖活动中,有n(1≤n≤105)个抽奖箱,其中第i个箱子里有ti(ti>0)个信封,其中li个里面有奖。所有人依次抽奖(即自主选择一个抽奖箱,然后随机抽一个信封),每次抽完后的空信封放回去。假设每个人都知道上述数据,并且足够聪明,求第k个人抽到奖的概率(用最简分数表示,保证分子和分母都在32位带符号整数范围内)。注意,每个人抽到奖之后只会默默地将它拿出,其他人并不会知道,因此不会改变既定的策略。
习题10-47 随机数(Randomness, UVa11429)
你有一个随机数发生器(RNG),可以得到1~R(2≤R≤1000)之间的随机整数(每个整数的概率均为1/R)。现在你希望用它在N(2≤N≤1000)个事件中随机选择一个,使得事件i的概率Pi等于给定的有理数ai/bi(1≤ai<bi≤1000)。你的任务是设计一个RNG使用算法,使得对RNG的调用次数的数学期望尽量小。可以多次使用这个RNG。
例如,当R=2,N=4,
时,则只需调用两次RNG,一共有4种可能的结果,分别对应一个事件。
习题10-48 考试(Exam, ACM/ICPC Chengdu 2012, UVa1655)
设f(x)为满足ab|x的(a,b)个数。输入n(1≤n≤1011),求f(1)+f(2)+…+f(n)。例如,
(即(1,1),(1,2),(2,1),(1,3),(3,1),(1,6),(6,1),(2,3),(3,2)),因此n=6时输出25。
习题10-49 指数塔(Exponential Towers, ACM/ICPC NWERC 2013, UVa1656)
用“^”来表示指数运算,即a^b=ab,例如,256=2^2^3=4^2^2(注意“^”是右结合的,即2^2^3表示2^(2^3))。定义
这样的表达式为“高度为k的指数塔”,其中k>1,且所有整数ai>1。输入一个高度为3的指数塔a^b^c(1≤a,b,c≤9585),统计有多少个高度至少为3的指数塔的值等于a^b^c。注意,9585这个常数可以保证输出小于263。
习题10-50 排列(Permutation, UVa11303)
输入一个长度为m的序列,每个元素均为1~n的正整数,并且不含相同元素。找出1~n的排列中有哪些排列包含输入子序列(不一定连续出现),求出字典序第k小的。例如,若输入子序列为1, 3, 2, n=4,则一共有4个排列:1,3,2,4;1,3,4,2;1,4,3,2;4,1,3,2,它们的字典序分别为第1,2,3,4小。1≤n≤250,1≤m≤n。
习题10-51 游戏(Game, ACM/ICPC ACM/ICPC NEERC 2003, UVa1657)
有这样一个游戏:裁判先公布一个正整数n(2≤n≤200),然后在1~n中选两个不同的整数x和y(x<y),把x+y告诉S先生,把x*y告诉P先生,然后依次循环S先生和P先生是否知道这两个数是几(总是先问S先生)。例如:
裁判:n=10(然后悄悄告诉S:x+y=9, x*y=18)。
S先生:不知道x和y是多少。
P先生:不知道x和y是多少。
S先生:不知道x和y是多少。
P先生:不知道x和y是多少。
S先生:知道了。x=3,y=6。
两人一共说了m次“不知道”后,下一个人算出了答案。已知S和P都非常聪明且精于心算,你的任务是根据n和m(0≤m≤100)计算出所有可能的(x,y)。
例如,n=10,m=4时有3个解:(2,5), (3,6), (3,10)。
————————————————————
(1) 如果g=0,意味着a或b等于0,可以特殊判断。