zoukankan      html  css  js  c++  java
  • 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 < 1001 <= 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靠拢,以期消去幂指数的思路。

    后面几个问题就不写了,没多大意思。

  • 相关阅读:
    Android开发总结
    LeakCanary原理分析
    机器学习
    Kivy 中文教程 实例入门 简易画板 (Simple Paint App):2. 实现绘图功能
    Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 3. 循环
    Kivy 中文教程 实例入门 简易画板 (Simple Paint App):1. 自定义窗口部件 (widget)
    Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 2. 变量
    Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 1. 神秘朋友
    Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 0. 准备工作
    远程显示(操作) 服务器 GUI 程序(图形化界面) (基于 X11 Forwarding + Centos + MobaXterm)
  • 原文地址:https://www.cnblogs.com/zcsor/p/6249065.html
Copyright © 2011-2022 走看看