A 最接近
这道题做对的同学还是很多的,但有一部分同学的错误原因是“不超过!!!!!”,转换成数学语言就是小于**等于**,要我们求出不超过N的最大的2的幂次方的正整数,可以先循环找出第一个超过N的2的幂次方的正整数,那它的上一个幂次方就是我们要找的答案了。数据范围在10^18,记得用long long.
B 序列
这道题的数据范围打败了所有人。题目给到X最大到10^30,大约在2^100(对对数有一定了解的同学可以解一下这个方程10^30=2^x,求出来x大约为100),而long long 最大可以保存2^63-1,所以long long已经不能作为本题的数据类型了。看到有同学(@@徐佳元)表示unsigned __int128可以使用,其实double就可以解决这个问题,double的数据最大可达1.79E+308。说完数据类型,来思考一下这题的解决思路,我们可以把a1~an视作一组进行累加求出和sum,看x中包含多少组,即x/sum组,那么到x/sum组结束后,k就为x/sum*n,接下来再在sum中依次累加a1~an,直到和大于x。注:用了double的地方,做除法的时候要注意取整,毕竟不管是下标还是组号都应该是整数。
C 互质
这道题题目中提到说数论是“数学的皇后”,于是所有使用穷举找互质的孩子们都被皇后打败了T-T。。因为如果使用穷举,那么程序最多执行N*M次,也就是10^11次,×超时。所以我们换一种方法。首先我们使用埃氏筛法将m以内的所有质数合数标记起来。因为一个数与另一个数互质有这么几种情况:①1与任何数都互质②如果两个数都是质数,那么他们绝对互质③如果其中有一个是合数,那么当质数与合数的质因数互质的情况下,他们也互质④如果两个数都是合数,那么他们两个不含有相同的质因数的情况下互质。接下来就开始判断1~m中的数字是否满足以上情况,如果满足,就是我们要找的答案了
D 矩阵
由于题目中提到每一步都是向下或者向右走,那么当前位置是否需要再次翻转就可以根据上一步的位置来决定。如果当前位置是0,不需要翻转,那么当前位置的翻转次数最小就是它的上一个或左一个的最少翻转次数。如果当前位置是1,那么需要根据它上一格或左一格是否为1来决定,如果是1,那么可以和前一次一起翻转,翻转次数不变;如果为0,那就要在最少翻转基础上再增加一次翻转。(以上文字请结合下图阅读)。