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所示,输入两个格子的编号aba,b≤10000),求最短距离。例如,19和30的距离为5(一条最短路是19-7-6-5-15-30)。

习题10-3 角度和正方形(Angles and Squares, ACM/ICPC Beijing 2005, UVa1643)

如图10-19所示,第一象限里有一个角,把nn≤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。给出NKN≤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)

输入两个正整数LULU<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)

输入两个整数LU(1≤LU≤109U-L≤10000),统计区间[L,U]的整数中哪一个的正约数最多。如果有多个,输出最小值。

习题10-10 统计有根树(Count, Chengdu 2012, UVa1645)

输入nn≤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)

给出nkn≤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,…输入nn≤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数hh≤1000001),输出1~h之间有多少个H-半素数。

习题10-18 一个研究课题(A Research Problem, UVa10837)

输入正整数mm≤108),求最小的正整数n,使得φ(n)=m。输入保证n小于200000000。

习题10-19 蹦极(Bungee Jumping, UVa10868)

James Bond为了摆脱敌人的追击,逃到了一座桥前。桥上正好有一条蹦极绳,于是他打算把它拴到腿上,纵身跳下桥,落地后切断绳子,继续逃生。已知绳子的正常长度为l,Bond的体重为w,桥的高度为s,你的任务是替James Bond判断能否用这种方法逃生。

当从桥上跳下后,绳子绷紧前Bond将做自由落体运动(重力按9.81w计),而绷紧后绳子会有向上的拉力,大小为kl,其中Δl为绳子当前长度和正常长度之差。当且仅当Bond可以到达地面,且落地速度不超过10米/秒时,才认为他安全着落。

输入每组数据包含4个非负整数k, l, s, ws<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 飞机环球问题示意图

假设:

 

输入ab,输出最少需要时用多少架飞机才能完成环游地球。例如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,……输入正整数nn<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。你的任务是求出最小的kn<263

习题10-26 方形花园(Square Garden, UVa12520)

L*LL≤106)网格里涂色nnL2)个格子,要求涂色格子的轮廓线周长尽量大。例如,图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 两种守卫方法

输入nk(2≤n≤105,1≤kmin(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)

nm列的棋盘里放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)排序后选择第一个能用的操作,前提是不能连续移动同一个盘子。给出nn≤30)和6种移动的顺序,求解Hanoi问题的步数。最终所有盘子可以都在B也可以都在C。例如,对于n=2,排序为AB, BA, CA, BC, CB, AC,一共需要5步。

习题10-33 二元运算(Binary Operation, ACM/ICPC NEERC 2010, UVa1651)

给定正整数ab,你的任务是计算的值,其中的计算方法是这样的:首先,如果ab的位数不同,位数较少的一个前面补0;然后逐位执行⊙操作。例如,当⊙表示“加起来模10”时,的计算方法如下:

操作符是左结合的,因此从左到右计算即可。

输入⊙的运算表(一个10*10矩阵,表示0⊙0, 0⊙1,…, 9⊙9的结果,其中0⊙0保证为0)和a, b(0≤ab≤1018)的值,输出所求结果。

习题10-34 记住密码(Password Remembering, ACM/ICPC Dhaka 2009, UVa12212)

输入正整数ABAB<264),求有多少个整数n满足:nAB之间(即AnB),且n翻转之后也在AB之间。1203翻转以后为3021,1050翻转以后是501。

习题10-35 Fibonacci单词(Fibonacci Word, ACM/ICPC World Finals 2012, UVa1282)

输入非空01串pn(0≤n≤100),求pF(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 nn≤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)

给出圆周上的nn≤2000)个点,选出其中的若干个组成一个正多形,有多少种方法?输出每行包含两个整数SF,表示有F种选法得到正S边形。各行应按S从小到大排序。

习题10-39 圆周上的三角形(Circum Triangle, UVa11186)

在一个圆周上有nn≤500)个点。不难证明,其中任意3个点都不共线,因此都可以组成一个三角形。求这些三角形的面积之和。

习题10-40 实验法计算概率(Probability Through Experiments, ACM/ICPC Hatyai 2012, UVa12535)

输入圆的半径和圆上nn≤20000)个点的极角,任选3点能组成多少个锐角三角形?

习题10-41 整数序列(A Sequence of Numbers, ACM/ICPC Chengdu 2007, UVa1406)

输入n个整数,执行Q个操作(n≤105Q≤200000)。有两种操作:

 

习题10-42 网格中的三角形(Triangles in the Grid, UVa12508)

一个nm列的网格有n+1条横线和m+1条竖线。任选3个点,可以组成很多三角形。其中有多少个三角形的面积位于闭区间[A,B]内?1≤n,m≤200,0≤A<Bnm

习题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数字最少的表示法。

输入每组数据第一行为用二进制表示的正整数nn≤25000),保证不含前导0。对于每组数据,输出非0数字最小的表示法(0表示0,+表示1,-表示-1)。如果有多解,输出字典序最小的。

习题10-46 抽奖(Honorary Tickets, UVa11895)

在一次抽奖活动中,有n(1≤n≤105)个抽奖箱,其中第i个箱子里有titi>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≤mn

习题10-51 游戏(Game, ACM/ICPC ACM/ICPC NEERC 2003, UVa1657)

有这样一个游戏:裁判先公布一个正整数n(2≤n≤200),然后在1~n中选两个不同的整数xyx<y),把x+y告诉S先生,把x*y告诉P先生,然后依次循环S先生和P先生是否知道这两个数是几(总是先问S先生)。例如:

裁判:n=10(然后悄悄告诉S:x+y=9, x*y=18)。

S先生:不知道xy是多少。

P先生:不知道xy是多少。

S先生:不知道xy是多少。

P先生:不知道xy是多少。

S先生:知道了。x=3,y=6。

两人一共说了m次“不知道”后,下一个人算出了答案。已知S和P都非常聪明且精于心算,你的任务是根据nm(0≤m≤100)计算出所有可能的(x,y)。

例如,n=10,m=4时有3个解:(2,5), (3,6), (3,10)。

————————————————————

(1) 如果g=0,意味着ab等于0,可以特殊判断。