2016.3.19纪中——中山市小学生信息学邀请赛2016模拟赛

来源:互联网 发布:js for循环 编辑:程序博客网 时间:2024/06/09 21:01

               中山市小学生信息学邀请赛2016模拟赛

    总结:这次比赛,有一定的数学考验,大部分都是数学题目。在考试的时候,没有多想,直接暴力解题,导致了许多时间超限。回来一看,原来都是O(1)的算法。真抱怨我考试的时候粗心大意,没有想就直接做。以后记得一定要多写,多画,多算!于是,我就写了一下这份解题报告,希望能够让自己时刻记得要认真一点。

    第一题:

                                                                                 荒岛猎人

题目描述

   克里特岛居住着一个猎人Hugh Glass。岛上有N(1<=N<=2*10^9)个山洞,依次编号为1,2,...,N。Hugh Glass有一个怪癖,他一生中最讨厌三个数a,b,c(a,b,c互不相等,且1<=a,b,c<=100),他坚决不会进入编号为a、b或者c的倍数的山洞。问你Hugh Glass可以进入多少个山洞?

输入

第一行输入四个整数N,a,b,c。

输出
输出一个整数,表示猎人有多少个山洞可以进入。

样例输入

10 2 3 5

样例输出

2


提示

样例解释:
    只有1号和7号山洞可以进。因为2、4、6、8、10是2个倍数,3、9是3的倍数,5是5的倍数,这8个数不符合要求。

数据范围:
50%的数据满足N<=10,000,000;
100%的数据满足1<=N<=2,000,000,000,1<=a,b,c<=100。

【解题思路】
         这道题,就是求a,b,c在N以内有几个公倍数。这道题其实是一个容斥原理。一开始,我们先求出a,b,c分别的公倍数倍数:+n div a+n div b+n div c,然后这样的公倍数一定会有重复的,比如18,就可能是3,6的倍数,重复了,所以要减去:-n div gcd(a,b)-n div gcd(a,c)-n div gcd(b,c),如果这样减,就可能减到了3有三个因数的数,所以要加进去,就是+n div gcd(gcd(a,b),c);
【代码】

<span style="font-size:14px;">var         a,b,c,n:longint;function gcd(x,y:longint):longint;var         r,x1,x2:longint;begin         x1:=x;         x2:=y;         r:=x mod y;         while r<>0 do         begin                  x:=y;                  y:=r;                  r:=x mod y;         end;         exit(y*(x1 div y)*(x2 div y));end;//这个是求最小公倍数的begin         assign(input,'a.in');reset(input);         assign(output,'a.out');rewrite(output);         readln(n,a,b,c);         writeln(n-(n div a+n div b+n div c+n div gcd(gcd(a,b),gcd(b,c))-n div gcd(a,b)-n div gcd(a,c)-n div gcd(b,c)));         close(input);close(output);end.</span>

第二题:

                             人机大战V

题目描述

         2016年3月13日,载入史册的一天,李世石执白战胜了阿法狗,虽然1:3败局已定,李世石还是想赢得第5场胜利,为人类扳回一点颜面。
         他提出一个新的玩法:N个棋子排成一排,从1到N编号,一开始都是黑色朝上。接下来第1秒,把所有编号为1的倍数的棋子翻转;第2秒,把所有编号为2的倍数的棋子翻转;第3秒,把所有编号为3的倍数的棋子翻转,。。。,这样的操作一直持续了N秒。
         现在李世石想考一下阿法狗N秒后一共有多少个棋子是黑色朝上,作为阿法狗软件工程师的你需要设计程序来解决。

输入

    第一行输入一个整数N(1<=N<=10^9),表示棋子的数量。

输出

输出N秒后黑色朝上的棋子数量。

样例输入

10

样例输出

7

数据范围限制

数据范围:
20%的数据满足:N<=5,000;
40%的数据满足:N<=100,000;
60%的数据满足:N<=1,000,000;
80%的数据满足:N<=10,000,000
100%的数据满足:N<=1,000,000,000。

提示

样例解释:
第1秒翻转棋子:1、2、3、4、5、6、7、8、9、10
第2秒翻转棋子:2、4、6、8、10
第3秒翻转棋子:3、6、9
第4秒翻转棋子:4、8
第5秒翻转棋子:5、10
第6秒翻转棋子:6
第7秒翻转棋子:7
第8秒翻转棋子:8
第9秒翻转棋子:9
第10秒翻转棋子:10
1号棋子被翻转1次,2号被翻转2次,3号被翻转2次,4号被翻转3次,5号被翻转2次,6号被翻转4次,7号被翻转2次,8号被翻转4次,9号被翻转3次,10号被翻转4次,2、3、5、6、7、8、10号棋子为黑色朝上,其余为白色朝上,答案为7。

【解题思路】

         这道题,我们不难可以发现,最后黑色朝上的,一定是完全平方数。这是为什么呢?因为完全平方数的因数是奇数,但是不是完全平方数的数,他的因数都是由双数个的。求1-n的完全平方数个数,就是trunc(sqrt(n));

【代码实现】

 var    <span style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;">n:qword;</span>
begin        assign(input,'b.in');reset(input);        assign(output,'b.out');rewrite(output);        readln(n);        writeln(n-trunc(sqrt(n)));        close(input);close(output);end.



0 0
原创粉丝点击