NOI上看到的几个小学奥数
7647:余数相同问题 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 已知三个正整数 a,b,c。 现有一个大于1的整数x,将其作为除数分别除a,b,c,得到的余数相同。 请问满足上述条件的x的最小值是多少? 数据保证x有解。 输入 一行,三个不大于1000000的正整数a,b,c,两个整数之间用一个空格隔开。 输出 一个整数,即满足条件的x的最小值。 样例输入 300 262 205 样例输出 19
解:设:a=k1*x+r;b=k2*x+r;c=k3*x+r,消去r:
a-b=(k1-k2)*x
b-c=(k2-k3)*x
a-c=(k1-k3)*x
现在有3个数n1,n2,n3求它们的最小公约数。可以继续把它们互相做减法,得到一系列数m1,m2,m3……集合n中的数和m中的数都能被最小公倍数整除,所以我们可以继续做减法,直到这些数足够小之后,取较小的两个的最小公约数。例如题目中的数据,300-262=38;262-205=57;57-38=19,19已经是一个质数了,所以它就是答案,如果还不是质数可以继续做减法。下一个题是蓄水池问题就不说了,从小落下的病根,看这个就想吐。
7649:我家的门牌号 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 我家住在一条短胡同里,这条胡同的门牌号从1开始顺序编号。 若所有的门牌号之和减去我家门牌号的两倍,恰好等于n,求我家的门牌号及总共有多少家。 数据保证有唯一解。 输入 一个正整数n。n < 100000。 输出 一行,包含两个正整数,分别是我家的门牌号及总共有多少家,中间用单个空格隔开。 样例输入 100 样例输出 10 15
解:设最大门牌号y,则有平均门牌号(y+1)/2,所以门牌号之和为y(y+1)/2。
设我家门牌号x,依题意有y(y+1)/2-2x=n。即:y(y+1)=2n+4x。
因x>0所以有:y(y+1)>2n。
例如题中数据,n=100,则可知y>=14。再利用1<=x<=y即可解出一个解。
7650:不定方程求解 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 给定正整数a,b,c。求不定方程 ax+by=c 关于未知数x和y的所有非负整数解组数。 输入 一行,包含三个正整数a,b,c,两个整数之间用单个空格隔开。每个数均不大于1000。 输出 一个整数,即不定方程的非负整数解组数。 样例输入 2 3 18 样例输出 4
解:方程等价于x/b+y/a=c/(a*b)。设y=0则有x=c/a;设x=0则有y=c/b。
于是0<=x<=c/a且0<=y<=c/b。
由此可知,由于c/a整除b时x才为整数,所以:c/a/b+1(0这个解)就是解个数,或者c/b/a+1都一样。
7652:乘积最大的拆分 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 将正整数n拆分为若干个互不相等的自然数之和,问如何拆分可以使得它们的乘积最大? 输入 一个正整数n。n <= 10000。 输出 一行,包含若干个互不相等的自然数——乘积最大的一种拆分方案。这些自然数需从小到大输出,两个自然数之间用单个空格隔开。 样例输入 15 样例输出 2 3 4 6
这个题应该是这样解,因为拆的份数越多(除了1之外)乘的结果越大,所以从2开始拆,不让相等那就拆成2、3、4……,最后如果还差点,那也没有办法,因为前面都是挨个来的,所以只能加到最后一个数上面。如题目中15,拆成2、3、4、5之后还剩下一个,那就拆2、3、4、6。
7655:回文数个数 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 不超过n位的正整数中,有多少个回文数? 输入 一个正整数n,n <= 10。 输出 一个整数,即回文数个数。 样例输入 5 样例输出 1098
这个题就不捣鼓方程了,所谓回文数就是正着反着看都是一样的,例如ABA,当然1位的话怎么看都一样。所以有:
1位数的时候1-9一共9个。
2位数的时候11-99一共9个。
然后递推就可以了:
1、向1位数两边各添一位相等的数,例如1两边都加2就是212,显而易见由于首位0的限制,只能有9种情况。但是,这时要注意,中间的那一位可以为0了,所以一共有9*(9+1)种情况。
2、向2位数两边各添加一位相等的数,情况与上面1相同,也有90种。
所以有结论:1、2位9种,3、4位90种,5、6位900种……题目让求和,那么1位有9种,2位18种,3位108种,4位198种……
以上,剩下再看到有趣的再写。
7657:连乘积末尾0的个数 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 给定两个正整数a,b(a < b)。求连乘积: a×(a+1)×(a+2)×...×(b-1)×b 的末尾有多少个0? 输入 一行,包括两个正整数a,b。a < b <= 10000 输出 一个整数,即连乘积末尾0的个数。 样例输入 11 56 样例输出 11
这个题比上一个李白的酒(通项:0.5*2^(n-1))有意思,从a乘到b,关注末尾的数字:0是怎么来的?考虑这样几种情况:
1、a个位为0:自然增加一个结尾0。
2、a个位为5:遇到下一个偶数(就是a+1)才得到一个结尾0或00或000…………,但根据题意a<b它一定会遇到。
3、a个位为1、2、3、4、6、7、8、9:奇数咋也乘不出来10来,偶数遇到5才行。
所以,这个题目需要检查一些特殊的情况:a=25,b=26和a=25,b=28结尾0个数是不一样的。当然,题目中所给的数字很容易判断:
11-56一共跨越了15、20、25、30、35、40、45、50、55一共9个可以造成末尾0的数字,而其中25、50含有2个5,所以结果是11个。而如果a和b跨度较短,则需要检测是否有足够的偶数消耗掉了5。当然,在广泛的范围内,也需要证明5可以被消耗完成,否则就只能挨个乘结尾为偶数和5的数字了。下一个题目分苹果就很简单了,n个小盆友每个人得到不同数目苹果,至少需要多少个?记得当初老太办公室一叔叔1+2+3……+100都难的我好半天。汗颜啊……
7827:质数的和与积 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 两个质数的和是S,它们的积最大是多少? 输入 一个不大于10000的正整数S,为两个质数的和。 输出 一个整数,为两个质数的最大乘积。数据保证有解。 样例输入 50 样例输出 589
从手动解的角度来看……这个题就只好有依据(两个乘数越接近积越大,n^2>(n+1)(n-1)这个。从s/2开始,s/2±2、4、6……)的蒙了,好吧,叫尝试法。没说两个质数不能相等吧?25、25不行,23、27不行,21、29不行,19、31看来就是了。从编程的角度来看,先计算sqrt(s)之前的筛子,然后也是类似的过程。
7828:最大公约数与最小公倍数 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 两个正整数的最大公约数是G,最小公倍数是L,它们的和最小是多少? 输入 两个不大于10000的正整数G和L,中间用单个空格隔开。数据保证L是G的倍数。 输出 一个正整数,即最小的和。 样例输入 14 280 样例输出 126
这个题说的是两数的乘积为G*L,问它们的最小和。可以得到两个等式:
1、a+b=x
2、a*b=G*L
将2带入1,可得:a+G*L/a=x,即a^2-x*a+G*L=0。其有解的充要条件就是x^2>=4*G*L了。
例如题目数据,x>=sqrt(4*14*280)即x>125.2。编程求来说应该没什么难度,记得向上取整是ceil函数。但是手动就需要手工开方……好吧,早就还给老师了,我们这样:先质因数分解为:4*14*14*4*5,就剩下4*14*sqrt(5)了,如果还不记得,那只好继续猜:2^2<5<3^2,所以是2.?,接下来就忘了,可以二分试值。
7829:神奇序列求和 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 有一个序列,初始时只有两个数x和y,之后每次操作时,在原序列的任意两个相邻数之间插入这两个数的和,得到新序列。举例说明: 初始:1 2 操作1次:1 3 2 操作2次:1 4 3 5 2 …… 问操作n次之后,得到的序列的所有数之和是多少? 输入 三个整数x,y,n,相邻两个数之间用单个空格隔开。0 <= x <= 5, 0 <= y <= 5, 1 < n <= 10。 输出 一个整数,即最终序列中所有数之和。 样例输入 1 2 2 样例输出 15
这个问题很有规律,观察下一级时上一次的和被利用了几次。把和作为一个整体即可得到规律。
7830:求小数的某一位 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 分数a/b化为小数后,小数点后第n位的数字是多少? 输入 三个正整数a,b,n,相邻两个数之间用单个空格隔开。0 < a < b < 100,1 <= n <= 10000。 输出 一个数字。 样例输入 1 2 1 样例输出 5
这个就编程来说似乎不算难,虽然用double也无法达到精度,但实际上实现起来甚至无需实现一个高精度除法:先求余,然后用余数乘10、100、1000、10000之类的(要看要求多少位了,其实每次都乘10代码最简单)就可以做出来了。笔算的话,我觉得应该是循环小数,否则就没有意思了。
7831:计算星期几 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 假设今天是星期日,那么过ab天之后是星期几? 输入 两个正整数a,b,中间用单个空格隔开。0 < a <= 100, 0 < b <= 10000。 输出 一个字符串,代表过ab天之后是星期几。 其中,Monday是星期一,Tuesday是星期二,Wednesday是星期三,Thursday是星期四,Friday是星期五,Saturday是星期六,Sunday是星期日。 样例输入 3 2000 样例输出 Tuesday
这个问题在上一个问题的路上越走越远。编程计算就是pow然后%7。手工计算的话,是利用幂的性质,把底数向7靠拢,以期消去幂指数的思路。
后面几个问题就不写了,没多大意思。