蓝书刘汝佳算法竞赛入门经典勘误

蓝书刘汝佳算法竞赛入门经典勘误
蓝书刘汝佳算法竞赛入门经典勘误

#《算法竞赛入门经典》勘误

关于勘误?下面的勘误很多来自于热心读者,再次向他们表示衷心的感谢!我并不清楚这些

错误实际是在哪个版本中改正过来的,所以麻烦大家都看一下。

有发现新错误的欢迎大家在留言中指出,谢谢!

一些一般性的问题?运算符?已经被废弃,请用min、max代替(代码仓库中的代码已更

新,g++ 4.6.2下编译通过)

重大错误?p24. 最后一行,“然后让max=INF,而min=-INF”应该是“然后让max=-INF, 而

min=INF”。

(感谢imxivid)

p43. 最后,判断s[i..j]是否为回文串的方法也不难写出:int ok = 1; for(k = i; i<=j;

i++)应该为for(k = i; k<=j; k++)

(感谢imxivid)

p45. 第七行和第九行i-j+1应为i+j+1。修改后:

1. {

2. for (j = 0; i - j >= 0 && i + j < m; j++)

3. {

4. if (s[i - j] != s[i + j]) break;

5. if

(j*2+1 > max) { max = j*2+1; x = p[i - j]; y = p[i + j];} 6. } 7.

for (j = 0; i - j >= 0 && i + j + 1 < m; j++) 8. { 9. if

(s[i - j] != s[i + j + 1]) break; 10. if (j*2+2 > max) 11. {max = j*2+2; x = p[i - j]; y = p[i + j + 1]; } 12. }

13. }p53. 例题4-1. 组合数. 输入非负整数n和m,这里的n和m写反了。应是“输

入非负整数m和n”。

p54. 举例中的m和n也写反了(真是个悲剧),且C(20,1)=20。

p71. 《周期串》代码的第8行,j++应为i++。

p72. 代码的第7行,“return”改为“break”以和其他地方一致。

p81. k为奇数和偶数的时候,分子和分母的顺序是不一样的。正确代码为:

#include<> int main() { int n; while(scanf("%d", &n) == 1) { int k = 1, s

= 0; for(;;) { s += k; if(s >= n) { if(k % 2 == 1) printf("%d/%d\n", s-n+1, k-s+n); else printf("%d/%d\n", k-s+n,

s-n+1); break; } k++; } } return 0; }以及:

#include<> #include<> int main() { int n; while(scanf("%d", &n) == 1) { int

k = (int)floor((sqrt*n+1)-1)/2 - 1e-9)+1; int s = k*(k+1)/2; if(k % 2 ==

1) printf("%d/%d\n", s-n+1, k-s+n); else printf("%d/%d\n", k-s+n,

s-n+1); } return 0; }上述代码已经更新到代码仓库中。

p83. 应为am * an = am+n。

(感谢

p85. 两张插图下面的文字“顺时针”、“逆时针”反了。

(感谢

p107. dfs函数有误,应为:

void dfs(int x, int y) { if(!mat[x][y] || vis[x][y]) return; 图7-5最右边

的有两个结点(3,1,*,*),应该只有一个。下面一段第一行的“它只有18个结点”也应该为

17个

(感谢, imxivid)

p134. 代码部分,vis36288应为vis362880。

(感谢lizhiwei)

P142 表格下面第一行的最后,应该是2^n

(感谢imxivid)

p152. 【分析】情况2的“由贪心策略,k比j轻”应为“由贪心策略,j比k轻”。

(感谢

p159.【分析】一个n层数字三角形的完整路线有2n条。改为2n-1条。

(感谢imxivid)

p160. 160页的方法3

int d(int i, int j) { ....会产生一个重定义错误,因为函数和数组共用了一个标识符。随便换一个数组名即可。

(感谢)

p171. 最上面,状态转移方程第二项应为f(k+1, j)。

(感谢imxivid)

p181. 例10-2的代码段会导致无穷递归。改为:

int pow_mod(int a, int n, int m) { if(n == 0) return 1; int x = pow_mod(a, n/2, m); long long ans = (long long)x * x % m; if (n%2 == 1) ans = ans * a % m; return (int) ans; }(感谢

p181. 例10-1的代码有误,改为:

#include #include const int maxn = 100 + 10; int main() { char n[maxn]; int m; scanf("%s%d", n, &m); int len = strlen(n); int ans = 0; for(int i = 0; i < len; i++) ans = (int)(((long long)ans * 10 + n[i] - '0') % m); printf("%d\n", ans); return 0; }(感谢

p188. 中间的边乘边除,(n-i)/n前面应加上(double)强制类型转换,不然结果会变成0. (感谢imxivid)

p200. 情况2第2行,“则T'+(u, v)”应为“则T+(u, v)”。

(感谢imxivid)

p204. 中间代码的下面第二行,因此可以用“……”应为priority_queue, greater >q。原文多写了个vector。

(感谢imxivid)

p205. 下面的程序的第一个注释,应该是迭代n-1次。

(感谢imxivid)

p207. 最大流问题上面,图11-4(b)的方案并不是最优的。可以找到增广路:从s到v2到

v3到t,残量分别是5(13),4(9),5(20),由此可以得到一条由s到t的增广路,所以最

大的运送量应该是23而不是19

(感谢东北师大附中王玉。我还欠你一本书)

p214. 第三行,Skenia应该是Skiena

小错误?包括比较明显的笔误或者排版问题。

p2.“实验4”下方的“3+4”应为“3-4”。

(感谢

p4. 例1-1【分析】中“平面几何”改成“几何”比较妥当,因为底面积算是立体几何中的

概念 :)

(感谢

p5. 页脚. “不信的话用gcc-ansi编译试试。”这里的gcc和减号之间应有一个空格,即

gcc -ansi

p20. 程序2-4倒数第三行. printfA,多了一个A,应该是printf

p70. 样例输出中的后双引号格式有问题。

p107. 两个程序的排版都有点小问题。上面的程序,倒数第三行的最后一个dfs应和它上面那一行的最后一个dfs对齐,这样整齐一些;第二个程序最后一个右花括号}应该和上一个左花括号{对齐。

p116. 的【分析】中“从n+1开始”应为“从S+1开始”。

(感谢

p124. 插图7-4 “a)皇后的攻击范围”没有画出范围。原稿中是有的,不知怎么没印出来... (感谢

p180. 最上面,例1最后一句,“即X=-6,Y=3是6x+15y=9”,“是”应为“时”。

(感谢imxivid)

p187. 最后一段“不管是C36523还是36523都无法……”应为“不管是P36523还是……”。(感谢

p190. 提示10-7上面一段,1,1,2,3,5,8……这行的下一行,“第n个兔子”应为“第n个月的兔子”。

(感谢imxivid)

p201. 图11-3的标题“路经”应为“路径”。

(感谢imxivid)

p207 最大流问题的第一段最后一行,“最多可以用9个物品”应为“最多可以有9个物品”。(感谢imxivid)

其他?p39页提到sprintf和strchr,但是只讲了sprintf。strchr的作用是在一个字符串中找一个子串,参见:

Comment by, Aug 25, 2011

1、160页的方法3

int d(int i, int j) {

if (di?j? >= 0) ....这里会产生一个重定义错误,因为函数和数组共用了一个标识符

2、162页,dp函数里面有一个运算符是" >?= " ??这种复合了条件表达式和赋值表达式的运算符,我没有看过他的用法,也没有成功使用过

3、107页那个深搜算法,(x - 1, y)这个方向被搜索了两次。

Comment by, Oct 6, 2012

第2页“实验4”下方的“3+4”应为“3-4”。

第4页例1-1【分析】中“平面几何”应为“立体几何”(或“几何”)。

第39页提到sprintf和strchr,但是只讲了sprintf。

第83页指数式am * an = am{{{*}}}n错误,应为am * an = am+n。

第85页两张插图下面的文字“顺时针”、“逆时针”反了。

第116页7.1.4的【分析】中“从n+1开始”应为“从S+1开始”。

第124页插图7-4 “a)皇后的攻击范围”没有画出范围?

第124页图7-5最右边的叶子结点(3, 1, *, *)多了一个。

第152页8.4.3【分析】情况2的“由贪心策略,k比j轻”似乎应为“由贪心策略,j比k 轻”。

第181页例10-2的代码段

int pow_mod(int a, int n, int m) { int x = pow_mod(a, n/2, m); ... ...似乎显然会导致无穷递归。

第187页的最后一段“不管是C36523还是36523都无法……”似乎应为“不管是P36523)还是……”。

Comment by, Oct 6, 2012

第181页例10-1的代码没有定义n和m。并且n是作为字符串读取的,代码第8行的n[i]似乎应为n[i] - '0'。

Comment by project member, Oct 6, 2012

谢谢的回复!第4页的“底面积公式”实际上就是圆面积公式,说平面几何也是合理的。不过严密起见,改成“几何”确实更妥 :) 第124页有些意外,我的原稿是用灰色格子表示攻击范围的,不知为何印刷出来却没有。其他问题我都同意。第181页的两处代码错误很不应该,我得自我反省一下...

Comment by, Oct 19, 2012

P142 表格下面第一行的最后,应该是2^n。

P124 解答树修改以后,下面一段第一行的“它只有18个结点”也应该为17个。

P72 代码的第7行,“return”似乎改为“break”更好。

P71 代码的第8行,j++应为i++。

P70 样例输出的最后一个双引号格式似乎应和'not to be'后面的双引号一样。

P54 第二行,“很不幸……-19.手算不难得到……是1。”很不幸,这两个结果我都没能得到。C(N,M)=C(1,20)显然无意义。

P48 最后一行,sscanf、sprintf和sstream的功能似乎不是很相似。用sscanf读字符串时,(多条语句)每用一个sscanf都会从字符串开头开始读取,但用sstream,会接上次结束部分继续读。

P47 中间的代码,if(si? == 1)应为if(si? == '1')。

P43 最后,判断s[i..j]是否为回文串的方法也不难写出: int ok = 1; for(k = i; i<=j; i++)应该为for(k = i; k<=j; k++)

P24 最后一行,“然后让max=INF,而min=-INF”应该是“然后让max=-INF, 而min=INF”。

P21 小注:“如果将两次操作一起做,可以在一定程度上缓解这个问题。”我试了一下,似乎对缓解问题没有任何效果。不知道作者在这里说的是什么意思。

Comment by, Oct 27, 2012

代码在那里下载?

Comment by, Oct 29, 2012

P21 现在好像看明白了,作者好像是让我们用double试一下两次操作一起做。

Comment by, Oct 29, 2012

P190 提示10-7上面一段,1,1,2,3,5,8……这行的下一行,“第n个兔子”应为“第n个月的兔子”。

P180 最上面,例1最后一句,“即X=-6,Y=3是6x+15y=9”,“是”应为“时”。

P171 最上面,状态转移方程第二项应为f(k+1, j)。

P159 【分析】一个n层数字三角形的完整路线有2n条,好像应该是2(n-1)条。

P156 分两步证明算法的正确性,我没看懂在说什么,不知道设的函数f(x)是什么意义。但是结论2第二行的“f(z)=f(x)+f(z)”似乎应为f(z)=f(x)+f(y)。

P152 乘船问题,情况2,改成j比k轻以后依然看不懂,哪个哪个不会超重,不知道到底怎么推出来的。

Comment by, Oct 29, 2012

P178 下面的代码,prime[c++] = i; 这句放到循环体内好像只能统计出1~m(根号n)范围内的素数吧……

Comment by, Oct 31, 2012

P211 “限于篇幅”上边,“我们规定capv?u?=0”是怎么回事?虽然我没大看懂,但是觉得好像应该是capv?v?=0。

P207 最大流问题的第一段最后一行,“最多可以用9个物品”似乎应为“最多可以有9个物品”。

P205 下面的程序的第一个注释,好像应该是迭代n-1次。

P204 中间代码的下面第二行,因此可以用“……”应为priority_queue, greater >q。原文多写了个vector。

P201 图11-3的标题“路经”应为“路径”。

P200 情况2第2行,“则T'+(u, v)”似乎应为“则T+(u, v)”。

P177的gcd函数我觉得写成return b?gcd(b, a%b):a;更简单,不知道对不对……

终于把这本书看完了,感觉选这本书真是选对了,这是我看过的最明白好懂的OI书!感谢作者!如果不是这本书,好多东西我自己在别处都看不懂!找出这些错误就当是报答作者吧~为这本书做点贡献……我很快会把书正文部分所有例题和算法都写成程序然后发出来!Comment by, Nov 2, 2012

P183 中间的杨辉三角递推,C[i-1][j-1]和C[i-1]j?会有负数下标的危险,外层循环应该为i=1,然后在外面加一句C0?0?=1。内层虽然没有错误,但是我觉得改成j <= i比较好。P173~174最优配对问题的代码好像有误。直接照着书上打进去,答案是不正确的。Comment by, Nov 2, 2012

P188中间的边乘边除,(n-i)/n前面应加上(double)强制类型转换,不然结果会变成0. Comment by project member, Nov 3, 2012

感谢imxivid!你说的绝大多数都是对的,我会尽快写在勘误中。有几个代码错误之前已经在googlecode中改正了,但是忘记在勘误里写了,呵呵。其他几个需要说明的:P54是m 和n写反了,P48的sscanf/sstream的用法以及几个贪心问题的证明我稍后详细叙述;P47是故意的,也就是“实验2”里会发现这个函数得不到正确的结果,然后“改正”。P21就是说的用double。P211没问题。cap[v][u]=0是为了允许反向增广

Comment by, Nov 4, 2012

训练指南 p80 Uva 11627 翻译错误输出不是数量应是速度能通过的速度最大的滑雪板的速度(坑死了)

Comment by project member, Nov 4, 2012

回复Tankchen:啊,真是抱歉。另外请在训练指南的相应章节后汇报勘误哈,这里是《入门经典》的勘误页。还有,下载代码的方法是使用git。我会不定期打包放在downloads里面的,目前还没有...

Comment by, Dec 13, 2012

p77 貌似把冒泡排序和选择排序弄错了吧?

Comment by, Jan 23, 2013

P38 最后一行可以用scanf("%s",si?)读取第i个字符串这里有问题吧,什么意思啊?Comment by, Feb 22, 2013

P31 习题2-2 水仙花数若3位数ABC满足ABC=A2+B2+C2 应为ABC=A3+B3+C3

Comment by, Mar 11, 2013

p50. 单词pig的输入方式写错了

蓝书刘汝佳算法竞赛入门经典勘误

#《算法竞赛入门经典》勘误 关于勘误?下面的勘误很多来自于热心读者,再次向他们表示衷心的感谢!我并不清楚这些错误实际是在哪个版本中改正过来的,所以麻烦大家都看一下。 有发现新错误的欢迎大家在留言中指出,谢谢! 一些一般性的问题?运算符?已经被废弃,请用min、max代替(代码仓库中的代码已更新,g++ 4.6.2下编译通过) 重大错误?p24. 最后一行,“然后让max=INF,而min=-INF”应该是“然后让max=-INF, 而min=INF”。 (感谢imxivid) p43. 最后,判断s[i..j]是否为回文串的方法也不难写出:int ok = 1; for(k = i; i<=j; i++)应该为for(k = i; k<=j; k++) (感谢imxivid) p45. 第七行和第九行i-j+1应为i+j+1。修改后: 1. { 2. for (j = 0; i - j >= 0 && i + j < m; j++) 3. { 4. if (s[i - j] != s[i + j]) break; 5. if (j*2+1 > max) { max = j*2+1; x = p[i - j]; y = p[i + j];} 6. } 7. for (j = 0; i - j >= 0 && i + j + 1 < m; j++) 8. { 9. if (s[i - j] != s[i + j + 1]) break; 10. if (j*2+2 > max) 11. {max = j*2+2; x = p[i - j]; y = p[i + j + 1]; } 12. } 13. }p53. 例题4-1. 组合数. 输入非负整数n和m,这里的n和m写反了。应是“输入非负整数m和n”。 p54. 举例中的m和n也写反了(真是个悲剧),且C(20,1)=20。 p71. 《周期串》代码的第8行,j++应为i++。 p72. 代码的第7行,“return”改为“break”以和其他地方一致。 p81. k为奇数和偶数的时候,分子和分母的顺序是不一样的。正确代码为: #include int main() { int n; while(scanf("%d", &n) == 1) { int k = 1, s = 0; for(;;) { s += k; if(s >= n) { if(k % 2 == 1) printf("%d/%d\n", s-n+1, k-s+n); else printf("%d/%d\n", k-s+n, s-n+1); break; } k++; } } return 0; }以及: #include #include int main() { int n; while(scanf("%d", &n) == 1) { int k = (int)floor((sqrt(8.0*n+1)-1)/2 - 1e-9)+1; int s = k*(k+1)/2; if(k % 2 == 1) printf("%d/%d\n", s-n+1, k-s+n); else printf("%d/%d\n", k-s+n, s-n+1); } return 0; }上述代码已经更新到代码仓库中。 p83. 应为am * an = am+n。 (感谢zr95.vip) p85. 两张插图下面的文字“顺时针”、“逆时针”反了。 (感谢zr95.vip) p107. dfs函数有误,应为: void dfs(int x, int y) { if(!mat[x][y] || vis[x][y]) return; // 曾经访问过这个格子,或者当前格子是白色vis[x][y] = 1; // 标记(x,y)已访问过dfs(x-1,y-1); dfs(x-1,y); dfs(x-1,y+1); dfs(x ,y-1); dfs(x ,y+1); dfs(x+1,y-1); dfs(x+1,y); dfs(x+1,y+1); // 递归访问周围的八个格子}(感谢zhongying822@https://www.360docs.net/doc/5917897836.html,) p124. 图7-5最右边的有两个结点(3,1,*,*),应该只有一个。下面一段第一行的“它只有18

最新算法竞赛入门经典各章(第二版)前4章课后习题答案电子教案

第一章习题1-1 #include int main() { int a,b,c; double d; scanf("%d%d%d",&a,&b,&c); d=(double)(a+b+c); printf("%.3lf\n",d/3.0); return 0; } 习题1-2 #include int main() { int f; double c; scanf("%d",&f); c=5*(f-32)/9; printf("%.3lf\n",c); return 0;

习题1-3 #include int main() { int n; scanf("%d",&n); printf("%d\n",(n*(1+n))/2); return 0; } 习题1-4 #include #include #define pi 4.0*atan(1.0) int main() { int n; scanf("%d",&n); printf("%lf\n",sin((pi*n)/180)); printf("%lf\n",cos((pi*n)/180)); return 0;

习题1-5 #include int main() { double x1,y1,x2,y2,a; scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2); a=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); printf("%lf\n",a); return 0; } 习题1-6 #include int main() { int n; scanf("%d",&n); if(n%2==0) { printf("YES\n"); }

大师兄教你如何过华为机试

大师兄教你如何过华为机试 宝典1—内功心法 大华为这个大数据时代土豪金海量式的招聘又要开始了!!! 近期听说大华为的校招机试马上就要开始了,由于华为软件岗位的招聘只有技术面跟机试是与技术有关的内容,所以机试的地位非常重要。对于机试,除了长期积累的软件基本功以外,还有很多可以短期训练的东西,类似于考试之前的突击,可以迅速提高机试成绩,就像在我西电大杨老师考前最后一堂课一定要去,那个重点就是考点阿。 这篇机试葵花宝典的内容是针对华为软件类上机准备的,如果你认真看了本宝典,如果你是真正通过自己能力考上西电的话,想不过都难。同样想拿高级题的同学,请移步 https://www.360docs.net/doc/5917897836.html,/land/或者https://www.360docs.net/doc/5917897836.html,,刷上200道题,机试不想拿满分都难。 对于机试,首先应该调整好自己的心态,不要觉得写程序很难,机试题很难,也不要去考虑,万一机试考到自己不会的内容怎么办,要相信,机试题永远是考察每个人的基础,基础是不会考的很偏的,会有人恰好做过某个题而做出来那个题,但不会有人恰好没做过一个题而做不出来那个题。 机试之前,应该做的准备有: 1、买一本《算法竞赛入门经典》,这本书不同于普通的算法或者编程语言的书籍,这 本书既讲语言,又讲算法,由浅入深,讲的很好,能看完前几章并且把例题都做 会,想通过机试就很简单了 2、调整好心态,时刻告诉自己,哪些小错误是自己以前经常犯的,最好用笔记本记录 下来,写每道题前再看一遍,如果遇到代码调不出来了,先想想自己是否犯过以 前那些错误。还有就是,看了题目以后,先仔细想清楚细节,在纸上写清楚自己 需要用到的变量,以及代码的基本框架,不要急于动手去写代码 3、不要惧怕任何一道看起来很难的题目,有不会的就去问身边会的人,让别人给自己 讲清楚 4、心中默念10遍C++跟C除了多了两个加号其实没有区别,会C就能上手C++ 5、大量的练习是必要且有效的 6、看完这篇宝典,预过机试、必练此功。 在这里推荐一个帖子,是机试归来的学长写的,写的很不错,里面的例题在后面的攻略

(完整)信息学奥赛(NOIP)必看经典书目汇总,推荐文档

信息学奥赛(NOIP)必看经典书目汇总! 小编整理汇总了一下大神们极力推荐的复习资料!(欢迎大家查漏补缺) 基础篇 1、《全国青少年信息学奥林匹克分区联赛初赛培训教材》(推荐指数:4颗星) 曹文,吴涛编著,知识点大杂烩,部分内容由学生撰写,但是对初赛知识点的覆盖还是做得相当不错的。语言是pascal的。 2、谭浩强老先生写的《C语言程序设计(第三版)》(推荐指数:5颗星) 针对零基础学C语言的筒子,这本书是必推的。 3、《骗分导论》(推荐指数:5颗星) 参加NOIP必看之经典 4、《全国信息学奥林匹克联赛培训教程(一)》(推荐指数:5颗星) 传说中的黄书。吴文虎,王建德著,系统地介绍了计算机的基础知识和利用Pascal语言进行程序设计的方法 5、《全国青少年信息学奥林匹克联赛模拟训练试卷精选》 王建德著,传说中的红书。 6、《算法竞赛入门经典》(推荐指数:5颗星) 刘汝佳著,算法必看经典。 7、《算法竞赛入门经典:训练指南》(推荐指数:5颗星) 刘汝佳著,《算法竞赛入门经典》的重要补充 提高篇 1、《算法导论》(推荐指数:5颗星) 这是OI学习的必备教材。

2、《算法艺术与信息学竞赛》(推荐指数:5颗星) 刘汝佳著,传说中的黑书。 3、《学习指导》(推荐指数:5颗星) 刘汝佳著,《算法艺术与信息学竞赛》的辅导书。(PS:仅可在网上搜到,格式为PDF)。 4、《奥赛经典》(推荐指数:5颗星) 有难度,但是很厚重。 5、《2016版高中信息学竞赛历年真题解析红宝书》(推荐指数:5颗星) 历年真题,这是绝对不能遗失的存在。必须要做! 三、各种在线题库 1、题库方面首推USACO(美国的赛题),usaco写完了一等基本上就没有问题,如果悟性好的话甚至能在NOI取得不错的成绩. 2、除此之外Vijos也是一个不错的题库,有很多中文题. 3、国内广受NOIP级别选手喜欢的国内OJ(Tyvj、CodeVs、洛谷、RQNOJ) 4、BJOZ拥有上千道省选级别及以上的题目资源,但有一部分题目需要购买权限才能访问。 5、UOZ 举办NOIP难度的UER和省选难度的UR。赛题质量极高,命题人大多为现役集训队选手。

BIG NUMBER 算法竞赛入门经典 刘汝佳

424-Integer Inquiry One of the first users of BIT's new supercomputer was Chip Diller.He extended his exploration of powers of3to go from0 to333and he explored taking various sums of those numbers. ``This supercomputer is great,''remarked Chip.``I only wish Timothy were here to see these results.''(Chip moved to a new apartment,once one became available on the third floor of the Lemon Sky apartments on Third Street.) Input The input will consist of at most100lines of text,each of which contains a single VeryLongInteger.Each VeryLongInteger will be100or fewer characters in length,and will only contain digits(no VeryLongInteger will be negative). The final input line will contain a single zero on a line by itself. Output Your program should output the sum of the VeryLongIntegers given in the input. Sample Input 123456789012345678901234567890 123456789012345678901234567890 123456789012345678901234567890 Sample Output 370370367037037036703703703670 10106–Product The Problem The problem is to multiply two integers X,Y.(0<=X,Y<10250) The Input The input will consist of a set of pairs of lines.Each line in pair contains one multiplyer. The Output For each input pair of lines the output line should consist one integer the product. Sample Input 12 12 2 222222222222222222222222 Sample Output 144 444444444444444444444444 465–Overflow Write a program that reads an expression consisting of two non-negative integer and an operator.Determine if either integer or the result of the expression is too large to be represented as a``normal''signed integer(type integer if you are working Pascal,type int if you are working in C). Input An unspecified number of lines.Each line will contain an integer,one of the two operators+or*,and another integer. Output For each line of input,print the input followed by0-3lines containing as many of these three messages as are appropriate: ``first number too big'',``second number too big'',``result too big''. Sample Input 300+3 9999999999999999999999+11 Sample Output 300+3 9999999999999999999999+11 first number too big

算法工程师本科生学习计划

算法工程师成长计划 大学期间必须要学好的课程:C/C++两种语言(或JA V A)、高等数学、线性代数、数据结构、离散数学、数据库原理、操作系统原理、计算机组成原理、人工智能、编译原理、算法设计与分析。 大一上学期: 1.C语言基础语法必须全部学会,提前完成C语言课程设计。 2.简单数学题:求最大公约数、筛法求素数、康托展开、同余定理、次方求模等。 3.计算机课初步:三角形面积,三点顺序等等。 4.学会计算简单程序的时间复杂度和空间复杂度。 5.二分查找、贪心算法经典算法。 6.简单的排序算法:冒泡排序法、插入排序法。 7.高等数学。 8.操作系统应用:DOS命令,学会Windows系统的一些小知识,学会编辑注册表, 学会使用组策略管理器(gpedit.msc)管理组策略等。 大一下学期: 1.掌握C++部分语法,如引用类型、函数重载等,基本明白什么是类。 2.学会使用栈和队列等线性结构。 3.掌握BFS和DFS以及树的前序、中序、后序遍历。 4.学会分治策略。 5.掌握排序算法:选择排序、归并排序、快速排序、计数、基数排序等等。 6.动态规划:最大子串和、最长公共子序列、最长单调递增子序列、01背包、完全背 包等。 7.数论:扩展欧几里德算法、求逆元、同余方程、中国剩余定理。 8.博弈论:博弈问题与SG函数的定义、多个博弈问题SG值的合并。 9.图论:图的存储、欧拉回路的判定、单源最短路Bellman-Ford算法及Dijkstra算法、 最小生成树Kruskal算法及Prim算法。 10.学会使用C语言进行网络编程与多线程编程。 11.高等数学、线性代数:做几道“矩阵运算”分类下的题目。 12.学习matlab,如果想参加数学建模大赛,需要学这个软件。 大一假期: 1.掌握C++语法,并熟练使用STL(重要)。 2.试着实现STL的一些基本容器和函数、使自己基本能看懂STL源码。 3.数据结构:字典树、并查集、树状数组、简单线段树。 4.图论:使用优先队列优化Dijkstra算法及Prim算法,单源最短路径之SPFA,差分 约束系统,多源多点最短路径之FloydWarshall算法,求欧拉回路(圈套圈算法)。 5.拓扑排序:复杂BFS和DFS搜索、复杂模拟题训练。 6.动态规划:多重背包、分组背包、依赖背包等各种背包问题(参见背包九讲)。 7.计算几何:判断点是否在线段上、线段相交、圆与矩形的关系、点是否在多边形内、 点到线段的最近点、多边形面积、求多边形重心、求凸包、点在任意多边形内外的 判定。 8.学习使用C/C++连接数据库、学习一种C++的开发框架来编写一些窗体程序(如 MFC、Qt)。

算法竞赛入门经典授课教案第7章 暴力求解法

第7章暴力求解法 【教学内容相关章节】 7.1简单枚举 7.2枚举排列 7.3子集生成 7.4回溯法 7.5隐式图搜索 【教学目标】 (1)掌握整数、子串等简单对象的枚举方法; (2)熟练掌握排列生成的递归方法; (3)熟练掌握用“下一个排列”枚举全排列的方法; (4)理解解答树,并能估算典型解答树的结点数; (5)熟练掌握子集生成的增量法、位向量法和二进制法; (6)熟练掌握回溯法框架,并能理解为什么它往往比生成-测试法高效; (7)熟练掌握解答树的宽度优先搜索和迭代加深搜索; (8)理解倒水问题的状态图与八皇后问题的解答树的本质区别; (9)熟练掌握八数码问题的BFS实现; (10)熟练掌握集合的两种典型实现——hash表和STL集合。 【教学要求】 掌握整数、子串等简单对象的枚举方法;熟练掌握排列生成的递归方法;熟练掌握用“下一个排列”枚举全排列的方法;理解子集树和排列树;熟练掌握回溯法框架;熟练掌握解答树的宽度优先搜索和迭代搜索;熟练掌握集合的两种典型实现——hash表和STL集合。【教学内容提要】 本章主要讨论暴力法(也叫穷举法、蛮力法),它要求调设计者找出所有可能的方法,然后选择其中的一种方法,若该方法不可行则试探下一种可能的方法。介绍了排列生成的递归方法;在求解的过程中,提出了解答树的概念(如子集树和排列树);介绍了回溯法的基本框架;介绍了集合的两种典型实现——hash表和STL集合。 【教学重点、难点】 教学重点: (1)熟练掌握排列生成的递归方法; (2)理解解答树,并能估算典型解答树的结点数; (3)熟练掌握子集生成的增量法、位向量法和二进制法; (4)熟练掌握回溯法框架,并能理解为什么它往往比生成-测试法高效; (5)熟练掌握解答树的宽度优先搜索和迭代搜索; (6)熟练掌握集合的两种典型实现——hash表和STL集合。 教学难点: (1)熟练掌握子集生成的增量法、位向量法和二进制法; (2)熟练掌握回溯法框架,并能理解为什么它往往比生成-测试法高效; (3)熟练掌握解答树的宽度优先搜索和迭代搜索; (4)熟练掌握集合的两种典型实现——hash表和STL集合。 【课时安排】 7.1简单枚举 7.2枚举排列 7.3子集生成 7.4回溯法 7.5隐式图搜索

算法竞赛入门经典授课教案第6章数据结构基础(精心排版,并扩充部分内容)

第6章数据结构基础 【教学内容相关章节】 6.1栈和队列 6.2链表 6.3二叉树 6.4图 【教学目标】 (1)熟练掌握栈和队列及其实现; (2)了解双向链表及其实现; (3)掌握对比测试的方法; (4)掌握随机数据生成方法; (5)掌握完全二叉树的数组实现; (6)了解动态内存分配和释放方法及其注意事项; (7)掌握二叉树的链式表示法; (8)掌握二叉树的先序、后序和中序遍历和层次遍历; (9)掌握图的DFS及连通块计数; (10)掌握图的BFS及最短路的输出; (11)掌握拓扑排序算法; (12)掌握欧拉回路算法。 【教学要求】 掌握栈和队列及其实现;掌握对比测试的方法;掌握随机数据生成方法;掌握完全二叉树的数组实现和链式表示法;掌握二叉树的先序、后序和中序遍历和层次遍历;掌握图的DFS和BFS遍历;掌握拓扑排序算法;掌握欧拉回路算法。 【教学内容提要】 本章介绍基础数据结构,包括线性表、二叉树和图。有两种特殊的线性表:栈和队列。对于树型结构主要讨论二叉树,还有二叉树的先序、中序和后序的遍历方式。对于图主要讨论图的DFS和BFS的遍历方法。这些内容是很多高级内容的基础。如果数据基础没有打好,很难设计正确、高效的算法。 【教学重点、难点】 教学重点: (1)掌握栈和队列及其实现; (2)掌握对比测试的方法;

(3)掌握随机数据生成方法; (4)掌握完全二叉树的数组实现和链式表示法; (5)掌握二叉树的先序、后序和中序遍历和层次遍历; (6)掌握图的DFS和BFS遍历; (7)掌握拓扑排序算法和欧拉回路算法。 教学难点: (1)掌握完全二叉树的数组实现和链式表示法; (2)掌握二叉树的先序、后序和中序遍历和层次遍历; (3)掌握图的DFS和BFS遍历; (4)掌握拓扑排序算法和欧拉回路算法。 【课时安排(共9学时)】 6.1栈和队列 6.2链表 6.3二叉树 6.4图

算法竞赛入门经典第二版习题答案

求int的上限与下限#include //运行时间长,请等待. int main() { int min ,max; FILE *fin,*fout; fin=fopen("min of int.out","wb"); fout=fopen("max of int.out","wb"); for(min=-1;min<0;) { min-- ; } fprintf(fin,"%d\n",min+1); for(max=1;max>0;) { max++ ; } fprintf(fout,"%d\n",max-1); fclose(fin); fclose(fout); return 0; } 1-1 #include int main() { int a,b,c; scanf("%d%d%d",&a,&b,&c); double average; average=(a+b+c)/3.0; //一定要将int型转为浮点型 printf("Average=%.3lf",average ); system("pause"); return 0; } 1-2 #include int main() { double f,c; printf("请输入华氏温度f\n"); scanf("%lf",&f); c=(f-32)*5/9 ; printf("摄氏温度c=%.3lf\n",c);

return 0; } 1-3 #include int main() { int n; scanf("%d",&n); printf("%d\n",(1+n)*n/2) ; system("pause"); return 0; } 1-4 #include #include int main() { const double pi =4.0*atan(1.0); int n; scanf("%d",&n); while(n>=360) { printf("请输入小于360°的角\n"); scanf("%d",&n); } printf("正弦:%lf\n余弦:%lf",sin(n*pi/180),cos(n*pi/180)); system("pause"); return 0; } 1-5 #include #include int main() { double x1,y1,x2,y2; printf("请输入点A的坐标\n"); scanf("%lf%lf",&x1,&y1); printf("请输入点B的坐标\n"); scanf("%lf%lf",&x2,&y2); double d; d=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); printf("%.3lf\n",d);

算法竞赛入门经典第二版习题问题详解

求int的上限与下限 #include //运行时间长,请等待. int main() { int min ,max; FILE *fin,*fout; fin=fopen("min of int.out","wb"); fout=fopen("max of int.out","wb"); for(min=-1;min<0;) { min-- ; } fprintf(fin,"%d\n",min+1); for(max=1;max>0;) { max++ ; } fprintf(fout,"%d\n",max-1); fclose(fin); fclose(fout); return 0; } 1-1 #include int main() { int a,b,c; scanf("%d%d%d",&a,&b,&c); double average; average=(a+b+c)/3.0; //一定要将int型转为浮点型 printf("Average=%.3lf",average ); system("pause"); return 0; } 1-2 #include int main() { double f,c; printf("请输入华氏温度f\n"); scanf("%lf",&f); c=(f-32)*5/9 ; printf("摄氏温度c=%.3lf\n",c);

return 0; } 1-3 #include int main() { int n; scanf("%d",&n); printf("%d\n",(1+n)*n/2) ; system("pause"); return 0; } 1-4 #include #include int main() { const double pi =4.0*atan(1.0); int n; scanf("%d",&n); while(n>=360) { printf("请输入小于360°的角\n"); scanf("%d",&n); } printf("正弦:%lf\n余弦:%lf",sin(n*pi/180),cos(n*pi/180)); system("pause"); return 0; } 1-5 #include #include int main() { double x1,y1,x2,y2; printf("请输入点A的坐标\n"); scanf("%lf%lf",&x1,&y1); printf("请输入点B的坐标\n"); scanf("%lf%lf",&x2,&y2); double d; d=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); printf("%.3lf\n",d);

算法竞赛入门经典第一章要点

第一章程序设计入门 1.1算术表达式 ?大小写字母代表的含义不同 ?整数值用%d输出,实数用%lf,小数点位数可以用%.nf中的n来控制 ?整数/整数=整数浮点数/浮点数=浮点数 1.2变量及其输入 ?可以通过scanf来输入数据,但是要注意每个变量前需要&符号。 ?比赛时不需编写提示信息。 ?不要让程序“按任意键退出”,即在程序的最后写入 return0; 尽量用const关键字声明变量 1.3顺序结构程序设计 ?注意数据的分离。准确的使用/和% ?十进制:非0数字打头 ?竞赛目标:解决问题 1.4分支结构程序设计 ?情况考虑周全,不仅仅是样例数据 1.5小结与习题 1.5.1数据类型实验 ?A1A2注意数据范围,数值太大,用double表示时,最好将数据换成浮点型?A3负数不能开方,计算过程中系统不会报错,最后结果是错误结果 ?A4编译报错 ?A5编译报错 1.5.2scanf输入格式实验 ?B1B2可以得到预期结果 ?B3前后插入大量空格或者水平制表符或者空格都可以 ?B4只能正常输出12,字符无法输出 1.5.3printf语句输出实验 ?C1两个空行:\n\n ?C2%%d ?C3\\n ?转义字符

1.5.4测测你的实践能力 问题1: 问题2、3: 问题4:!14级&&5级||4级问题5:if(a) {if(b)x++; else y++; } 1.5.6上机练习 习题1-1平均数 注意将整数换成实数 习题1-2温度 可直接将f定义成float类型 习题1-3连续和 注意求和公式(a1+an)*n/2 习题1-4正弦和余弦 注意将数值转换成角度,n*pa/180 习题1-5距离 距离公式sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))习题1-6偶数 x%2==0 x==(x/2)+(x/2) (x+1)%2==1

《算法竞赛入门经典》

算法竞赛入门竞赛 第1章程序设计入门 学习目标 ?熟悉C语言程序的编译和运行 ?学会编程计算并输出常见的算术表达式的结果 ?掌握整数和浮点数的含义和输出方法 ?掌握数学函数的使用方法 ?初步了解变量的含义 ?掌握整数和浮点数变量的声明方法 ?掌握整数和浮点数变量的读入方法 ?掌握变量交换的三变量法 ?理解算法竞赛中的程序三步曲:输入、计算、输出 ?记住算法竞赛的目标及其对程序的要求 计算机速度快,很适合做计算和逻辑判断工作。本章首先介绍顺序结构程序设计,其基本思路是:把需要计算机完成的工作分成若干个步骤,然后依次让计算机执行。注意这里的“依次”二字——步骤之间是有先后顺序的。这部分的重点在于计算。 接下来介绍分支结构程序设计,用到了逻辑判断,根据不同情况执行不同语句。本章内容不复杂,但是不容忽视。 注意:编程不是看会的,也不是听会的,而是练会的,所以应尽量在计算机旁阅读本书,以便把书中的程序输入到计算机中进行调试,顺便再做做上机练习。千万不要图快——如果没有足够的时间用来实践,那么学得快,忘得也快。 1.1 算术表达式 计算机的“本职”工作是计算,因此下面先从算术运算入手,看看如何用计算机进行复杂的计算。 程序1-1 计算并输出1+2的值 #include int main()

算法竞赛入门经典 ·2· { printf("%d\n", 1+2); return 0; } 这是一段简单的程序,用于计算1+2的值,并把结果输出到屏幕。如果你不知道如何编译并运行这段程序,可阅读附录或向指导教师求助。 即使你不明白上述程序除了“1+2”之外的其他内容,仍然可以进行以下探索:试着把“1+2”改成其他东西,而不要去修改那些并不明白的代码——它们看上去工作情况良好。 下面让我们做4个实验: 实验1:修改程序1-1,输出3-4的结果 实验2:修改程序1-1,输出5×6的结果 实验3:修改程序1-1,输出8÷4的结果 实验4:修改程序1-1,输出8÷5的结果 直接把“1+2”替换成“3+4”即可顺利解决实验1,但读者很快就会发现:无法在键盘上找到乘号和除号。解决方法是:用星号“*”代替乘号,而用正斜线“/”代替除号。这样,4个实验都顺利完成了。 等一下!实验4的输出结果居然是1,而不是正确答案1.6。这是怎么回事?计算机出问题了吗?计算机没有出问题,问题出在程序上:这段程序的实际含义并非和我们所想的一致。 在C 语言中,8/5的确切含义是8除以5所得商值的整数部分。同样地,(-8)/5的值是-1,不信可以自己试试。那么如果非要得到8÷5=1.6的结果怎么办?下面是完整的程序。 程序1-2 计算并输出8/5的值,保留小数点后1位 #include int main() { printf("%.1lf\n", 8.0/5.0); return 0; } 注意,百分号后面是个小数点,然后是数字1,再然后是小写字母l ,最后是小写字母f ,千万不能打错,包括大小写——在C 语言中,大写和小写字母代表的含义是不同的。 再来做3个实验: 实验5:把%.1lf 中的数字1改成2,结果如何?能猜想出“1”的确切意思吗?如果把小数点和1都删除,%lf 的含义是什么? 实验6:字符串%.1lf 不变,把8.0/5.0改成原来的8/5,结果如何? 实验7:字符串%.1lf 改成原来的%d ,8.0/5.0不变,结果如何? 实验5并不难解决,但实验6和实验7的答案就很难简单解释了——真正原因涉及整数和浮点数编码,相信多数初学者对此都不感兴趣。原因并不重要,重要的是规范:根据规范做事情,则一切尽在掌握中。

信息竞赛推荐书籍

?基础篇 1、《全国青少年信息学奥林匹克分区联赛初赛培训教材》(推荐指数:4颗星) 曹文,吴涛编著,知识点大杂烩,部分内容由学生撰写,但是对初赛知识点的覆盖还是做得相当不错的。语言是pascal的。 2、谭浩强老先生写的《C语言程序设计(第三版)》(推荐指数:5颗星) 针对零基础学C语言的筒子,这本书是必推的。 3、《骗分导论》(推荐指数:5颗星) 参加NOIP必看之经典 4、《全国信息学奥林匹克联赛培训教程(一)》(推荐指数:5颗星) 传说中的黄书。吴文虎,王建德著,系统地介绍了计算机的基础知识和利用Pascal语言进行程序设计的方法 5、《全国青少年信息学奥林匹克联赛模拟训练试卷精选》 王建德著,传说中的红书。 6、《算法竞赛入门经典》(推荐指数:5颗星) 刘汝佳著,算法必看经典。 7、《算法竞赛入门经典:训练指南》(推荐指数:5颗星) 刘汝佳著,《算法竞赛入门经典》的重要补充 ?提高篇 1、《算法导论》(推荐指数:5颗星) 这是OI学习的必备教材。 2、《算法艺术与信息学竞赛》(推荐指数:5颗星) 刘汝佳著,传说中的黑书。

3、《学习指导》(推荐指数:5颗星) 刘汝佳著,《算法艺术与信息学竞赛》的辅导书。(PS:仅可在网上搜到,格式为PDF)。 4、《奥赛经典》(推荐指数:5颗星) 有难度,但是很厚重。 5、《2016版高中信息学竞赛历年真题解析红宝书》(推荐指数:5颗星) 历年真题,这是绝对不能遗失的存在。必须要做! 三、各种在线题库 1、题库方面首推USACO(美国的赛题),usaco写完了一等基本上就没有问题,如果悟性好的话甚至能在NOI取得不错的成绩. 2、除此之外Vijos也是一个不错的题库,有很多中文题. 3、国内广受NOIP级别选手喜欢的国内OJ(Tyvj、CodeVs、洛谷、RQNOJ) 4、BJOZ拥有上千道省选级别及以上的题目资源,但有一部分题目需要购买权限才能访问。 5、UOZ 举办NOIP难度的UER和省选难度的UR。赛题质量极高,命题人大多为现役集训队选手。

算法竞赛-入门经典-作者刘汝佳

算法竞赛-入门经典-作者刘汝佳.doc 第1部分语言篇 第1章程序设计入门 学习目标 ?熟悉C语言程序的编译和运行 ?学会编程计算并输出常见的算术表达式的结果 ?掌握整数和浮点数的含义和输出方法 ?掌握数学函数的使用方法 ?初步了解变量的含义 ?掌握整数和浮点数变量的声明方法 ?掌握整数和浮点数变量的读入方法 ?掌握变量交换的三变量法 ?理解算法竞赛中的程序三步曲:输入、计算、输出 ?记住算法竞赛的目标及其对程序的要求 计算机速度快,很适合做计算和逻辑判断工作。本章首先介绍顺序结构程序设计,其基本思路是:把需要计算机完成的工作分成若干个步骤,然后依次让计算机执行。注意这里的“依次”二字——步骤之间是有先后顺序的。这部分的重点在于计算。 接下来介绍分支结构程序设计,用到了逻辑判断,根据不同情况执行不同语句。本章内容不复杂,但是不容忽视。 注意:编程不是看会的,也不是听会的,而是练会的,所以应尽量在计算机旁阅读本书,以便把书中的程序输入到计算机中进行调试,顺便再做做上机练习。千万不要图快——如果没有足够的时间用来实践,那么学得快,忘得也快。 (为帮助没有分值的朋友能下载,特此修改文档,以免上传不了) 1.1 算术表达式 计算机的“本职”工作是计算,因此下面先从算术运算入手,看看如何用计算机进行复杂的计算。 程序1-1 计算并输出1+2的值 #include int main() { printf("%d\n", 1+2); return 0; }

算法竞赛入门经典 这是一段简单的程序,用于计算1+2的值,并把结果输出到屏幕。如果你不知道如何编译并运行这段程序,可阅读附录或向指导教师求助。 即使你不明白上述程序除了“1+2”之外的其他内容,仍然可以进行以下探索:试着把“1+2”改成其他东西,而不要去修改那些并不明白的代码——它们看上去工作情况良好。 下面让我们做4个实验: 实验1:修改程序1-1,输出3-4的结果 实验2:修改程序1-1,输出5×6的结果 实验3:修改程序1-1,输出8÷4的结果 实验4:修改程序1-1,输出8÷5的结果 直接把“1+2”替换成“3+4”即可顺利解决实验1,但读者很快就会发现:无法在键盘上找到乘号和除号。解决方法是:用星号“*”代替乘号,而用正斜线“/”代替除号。这样,4个实验都顺利完成了。 等一下!实验4的输出结果居然是1,而不是正确答案1.6。这是怎么回事?计算机出问题了吗?计算机没有出问题,问题出在程序上:这段程序的实际含义并非和我们所想的一致。 在C语言中,8/5的确切含义是8除以5所得商值的整数部分。同样地,(-8)/5的值是-1,不信可以自己试试。那么如果非要得到8÷5=1.6的结果怎么办?下面是完整的程序。 程序1-2 计算并输出8/5的值,保留小数点后1位 #include int main() { printf("%.1lf\n", 8.0/5.0); return 0; } 注意,百分号后面是个小数点,然后是数字1,再然后是小写字母l,最后是小写字母f,千万不能打错,包括大小写——在C语言中,大写和小写字母代表的含义是不同的。 再来做3个实验: 实验5:把%.1lf中的数字1改成2,结果如何?能猜想出“1”的确切意思吗?如果把小数点和1都删除,%lf的含义是什么? 实验6:字符串%.1lf不变,把8.0/5.0改成原来的8/5,结果如何? 实验7:字符串%.1lf改成原来的%d,8.0/5.0不变,结果如何? 实验5并不难解决,但实验6和实验7的答案就很难简单解释了——真正原因涉及整数和浮点数编码,相信多数初学者对此都不感兴趣。原因并不重要,重要的是规范:根据规范做事情,则一切尽在掌握中。

算法竞赛入门经典授课教案第2章_循环结构程序设计(精心排版,并扩充部分内容)

第2章循环结构程序设计 【教学内容相关章节】 2.1 for循环 2.2 循环结构程序设计 2.3文件操作 2.4 小结与习题 【教学目标】 (1)掌握for循环的使用方法; (2)掌握while循环的使用方法; (3)学会使用计算器和累加器; (4)学会用输出中间结果的方法调试; (5)学会用计时函数测试程序效率; (6)学会用重定向的方式读写文件; (7)学会fopen的方式读写文件; (8)了解算法竞赛对文件读写方式和命名的严格性; (9)记住变量在赋值之前的值是不确定的; (10)学会使用条件编译指示构建本地运行环境。 【教学要求】 掌握for循环的使用方法;掌握while循环的使用方法;掌握几个常用的文件操作库函数fopen、fclose、fprintf、fscanf等。 【教学内容提要】 在有些程序中,需要反复执行某些语句。将n条相同的语句简单地复制会使程序变得不合理的冗长,因此高级语言中提供了支持程序重复执行某一段程序的循环控制语句。相关的语句有:for、while、do while、break、continue等。 既可以从文件中读取数据, 也可以向文件中写入数据。读写文件之前,首先要打开文件。读写文件结束后,要关闭文件。C/C++提供了一系列库函数,声明于stdio.h中,用于进行文件操作。这里介绍其中几个常用的文件操作库函数fopen、fclose、fprintf、fscanf等。 【教学重点、难点】

教学重点: (1)掌握for循环的使用方法; (2)掌握while循环的使用方法; (3)掌握文件有关操作; (4)条件编译。 教学难点: (1)掌握for循环的使用方法; (2)掌握while循环的使用方法; 【课时安排(共2学时)】 2.1 for循环 2.2 循环结构程序设计 2.3 文件操作 2.4 小结与习题

number theory 算法竞赛入门经典 刘汝佳

number theory 575 - Skew Binary When a number is expressed in decimal, the k-th digit represents a multiple of 10k. (Digits are numbered from right to left, where the least significant digit is number 0.) For example, When a number is expressed in binary, the k-th digit represents a multiple of 2k. For example, In skew binary, the k-th digit represents a multiple of 2k+1 - 1. The only possible digits are 0 and 1, except that the least-significant nonzero digit can be a 2. For example, The first 10 numbers in skew binary are 0, 1, 2, 10, 11, 12, 20, 100, 101, and 102. (Skew binary is useful in some applications because it is possible to add 1 with at most one carry. However, this has nothing to do with the current problem.) Input The input file contains one or more lines, each of which contains an integer n. If n = 0 it signals the end of the input, and otherwise n is a nonnegative integer in skew binary. Output For each number, output the decimal equivalent. The decimal value of n will be at most 231 - 1 = 2147483647. Sample Input 10120 200000000000000000000000000000 10 1000000000000000000000000000000 11 100 11111000001110000101101102000 Sample Output 44 2147483646 3 2147483647 4 7 1041110737 10110 - Light, more light There is man named "mabu" for switching on-off light in our University. He switches on-off the lights in a corridor. Every bulb has its own toggle switch. That is, if it is pressed then the bulb turns on. Another press will turn it off. To save power consumption (or may be he is mad or something else) he does a peculiar thing. If in a corridor there is `n' bulbs, he walks along the corridor back and forth `n' times and in i'th walk he toggles only the switches whose serial is divisable by i. He does not press any switch when coming back to his initial position. A i'th walk is defined as going down the corridor (while doing the peculiar thing) and coming back again. Now you have to determine what is the final condition of the last bulb. Is it on or off? The Input The input will be an integer indicating the n'th bulb in a corridor. Which is less then or equals 2^32-1. A zero indicates the end of input. You should not process this input. The Output Output "yes" if the light is on otherwise "no" , in a single line. Sample Input 3 6241 8191

相关文档
最新文档