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靠拢,以期消去幂指数的思路。

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

  • 相关阅读:
    NOIP2014-普及组复赛-第二题-比例简化
    NOIP2014-普及组复赛-第一题-珠心算测验
    洛谷-不高兴的津津(升级版)-数组
    洛谷-陶陶摘苹果(升级版)-数组
    洛谷-小鱼比可爱-数组
    小车问题
    洛谷-小鱼的数字游戏-数组
    洛谷-校门外的树-数组
    centos 6.5 minimal 安装及vm-tools安装
    php使用第三方登录
  • 原文地址:https://www.cnblogs.com/zcsor/p/6249065.html
Copyright © 2011-2022 走看看