T1无关

一道经典的容斥原理题目。 对于3030%的数据,可以用暴力骗一波分。

对于100100%的数据,L-R可以达到101810^{18},对于暴力来说太大了。但是k20k\leq 20,相对来说是极小的。

于是我们想到了容斥原理:

A1A2Am=\left|A_{1} \cup A_{2} \cup \cdots \cup A_{m}\right|= 1imAi1i<jmAiAj+1i<j<kmAiAjAk+(1)m1A1A2Am\sum_{1 \leq i \leq m}\left|A_{i}\right|-\sum_{1 \leq i<j \leq m}\left|A_{i} \cap A_{j}\right|+\sum_{1 \leq i<j<k \leq m}\left|A_{i} \cap A_{j} \cap A_{k}\right|-\cdots+(-1)^{m-1}\left|A_{1} \cap A_{2} \cap \cdots \cap A_{m}\right|

[1,N][1, N]内,由于aa数组内全部都是质数,是a[i]a[i]的倍数的数的数目为Na[i]\left\lfloor\frac{N}{a[i]}\right\rfloor,是a[i],a[j]\mathrm{a}[\mathrm{i}], \mathrm{a}[\mathrm{j}]的倍数的数的数目为Na[i]a[j]\left\lfloor\frac{N}{a[i] a[j]}\right\rfloor,以此类推。

枚举子集即可,复杂度为Θ(k2k)\Theta\left(k \cdot 2^{k}\right),但必须对元素乘积超过NN的集合进行剪枝,这样跑起来是极快的。

PS: 本来出题人是打算k02ai40k\leq 0, 2\leq a_i\leq 40, 不保证质数,然后再去重的,但是要加一层lcm,既有可能求lcm的过程中爆炸,又会增加复杂度。考虑到这是小白赛,出题人最终还是保证质数,范围给到了k202ai100k\leq 20,2\leq a_i\leq 100

T2范围

经典的柯西不等式:

(1a1+1a2++1an1+1an)(a1x12+a2x22++an1xn12+anxn2)=1×(Bx2)\left(\frac{1}{a_{1}}+\frac{1}{a_{2}}+\ldots+\frac{1}{a_{n-1}}+\frac{1}{a_{n}}\right)\left(a_{1} x_{1}^{2}+a_{2} x_{2}^{2}+\ldots+a_{n-1} x_{n-1}^{2}+a_{n} x_{n}^{2}\right)=1 \times\left(B-x^{2}\right) \geq (x1+x2++xn1+xn)2=(Ax)2\left(x_{1}+x_{2}+\ldots+x_{\mathrm{n}-1}+x_{\mathrm{n}}\right)^{2}=(A-x)^{2}

最终问题转化到了 :

2x22Ax+A2B02 x^{2}-2 A x+A^{2}-B \leq 0 的取值范围

利用二元一次方程的性质求解即可

T3水题

首先,满足给出公式的函数(数列)为: Fibonacci sequence.不了解的可以自行百度。

对于读入的nn,只要判断是不是斐波那契数就可以了:

(1)若不是,就是一个n皇后问题(位运算优化)

(2)若是, 就是一个进制转化的问题,随便做一下就过了

T4阶乘

我可能缺一道真签到题。 观察这个表达式我们发现o的个数即为该表达式的最终结果含有1010 的几次方的因子。 我们就联想到了拆素数。 并且1010nn次方都有一个通性:质因子只有2255。 显而易见,最终结果中质因子22的个数远远大于55的个数。 所以这道题就是找因子55的个数。 由于是阶乘的连乘,后一个数a都比前一个数(21)(2-1)多乘了个aa。 我们的目标是找55的个数,也就是每五个一循环,更新每次乘上的55的个数。 思路很好想,剩下的就是看代码能力了。

T5面积

我可能是个胡诌高手呢。 首先扔一波尔约-格维也纳定理,即任意两个面积相等多边形能够通过有限次裁剪拼接得到:

结论1:任意两个正方形,可以拼接成一个大正方形。如图 alt 结论2:任意多个正方形都可以拼接成一个大正方形。 证明:滚雪球,拿两个一拼,然后完了再拿两个一拼。最后就剩一个大正方形。

结论3:如果图形A能拼接成图形B,图形B能拼接成圄形C,则图形A也能拼接成圉形C。

结论4:如果圄形A能拼接成图形B,则图形B也能拼接成图形A。

结论5:若矩形的长宽之比小于4:1,则这个矩形可以拼接成正方形。

结论6:任意一个长宽之比超过4:1的矩形都能拼接成一个长宽比小于4:1 的矩形。

结论7:由5. 6推出,任意一个矩形可以拼接成一个正方形。

结论8:任意一个平行四边形都可以拼接成一个矩形。如图

alt

结论9:任意一个三角形都能拼接成一个平行四边形。如图 alt

结论10:任意一个四边形都可以拼接成一个正方形(以为任意一个四边形都可以又若干三角形组成)。

结论11:任意一个多边形都可以拼接成一个正方形(理由同上)。如图 alt

于是,我们得到了一个更加疯狂的结论。 最终得到结论12,即就是波尔约-格维也纳定理:

任意两个面积相等的多边形,它们可以相互拼接得到。 由法卡斯.波尔约(Farks Bolyai)和保罗.格维也纳(Paul Gerwien)两位数学家分别在1833年和1835年证明。

一张方格纸上,上面画着纵横两组平行线,相邻平行线之间的距离都相等, 这样两组平行线的交点,就是所谓格点。如果取一个格点做原点OO,如图1,取 通过这个格点的横向和纵向两直线分别做横坐标轴0X和纵坐标轴OYOY,并取原来方格边长做单位长,建立一个坐标系。这时前面所说的格点,显然就是纵横两坐标都是整数的那些点。如图1中的O.PQ.MNO. P、Q. M、N都是格点。由于这个缘故, 我们又叫格点为整点。

一个多边形的顶点如果全是格点,这多边形就叫做格点多边形。有趣的是,这种格点多边形的面积计算起来很方便,只要数一下图形边线上的点的数目及图内的点的数目,就可用公式算出。

这个公式是皮克(Pick)在1899年给出的,被称为“皮克定理”,这是一个实用而有趣的定理。

给定顶点坐标均是整点(或正方形格点)的简单多边形,皮克定理说明了其面积SS和内部格点数目nn、边上格点数目ss的关系:

S=n+s21S=n+\frac{s}{2}-1 又叫格点为整点。

(其中n表示多边形内部的点数,s表示多边形边界上的点数,S表示多边形的面积)

所以,一个点阵的“最大生成图”的面积恒为 M×N21\frac{M \times \mathrm{N}}{2}-1, 可以利用向量叉积求 出三角形的面积,只需要判断这两个面积是否相等就可以了。

T6圆

我可能坑了一波做题人,Python 或java并不比C++好做多少,因为规律并不是2n12^{n-1}

这是一道欧拉公式题!

alt

如果圆上只有一个点,圆内将不会产生任何线段,整个圆仍然是完整的一块。 图7显示的就是nn分别为2342、3、4的情况。可以看到,圆分别被划分成了2482、4、 8块。规律似乎非常明显:圆周上每多一个点,划分出来的区域数就会翻一倍。 事实上规律真的是这样吗?让我们来看看n=5n=5的时候(图8)。

alt

果然不出所料,整个圆被分成了1616块,区域数依旧满足2n12n-1的规律。此时, 大家都会觉得证据已经充分,不必再往下验证了吧。偏偏就在n=6n=6的时候,意外 出现了(圈9)。

此时,区域数只有3131个。那么,这个数列规律究竟是什么呢?这回,欧拉公式又帮上了大忙。圆周上每四个点交叉相连,就会在圆内产生一个交点,因此圆内共有Cn4C_{n}^{4}个交点,因此圆周上本身的 nn个点,可得图中的总顶点数V=Cn4+nV=C_{n}^{4}+n。圈内每个顶点的度数都为44,圆周上每个顶点度数都是n+1n+1,因此图中顶点的度数之和为4Cn4+n(n+1)4 C_{n}^{4}+n(n+1)。由于每根线条都贡献了两个度,因而图中的总线条数就是E=4Cn4+n(n+1)2=2Cn4+n(n+1)2E=\frac{4 C_{n}^{4}+n(n+1)}{2}=2 C_{n}^{4}+\frac{n(n+1)}{2}。因此,图中的总区域数就是: F=EV+2=(2Cn4+n(n+1)2)(Cn4+n)+2=Cn4+n(n+1)2+2F=E-V+2=\left(2 C_{n}^{4}+\frac{n(n+1)}{2}\right)-\left(C_{n}^{4}+n\right)+2=C_{n}^{4}+\frac{n(n+1)}{2}+2

它可以写成Cn4+Cn2+2C_{n}^{4}+C_{n}^{2}+2,去掉圆外面那个无限大的区域,圆内部的区域数也就是Cn4+Cn2+1C_{n}^{4}+C_{n}^{2}+1。其实这个答案也不难理解:每画出一条新线段后,假如这条新线段与原来已有的线段产生了kk个新交点,那么圆内就会增加k+1k+1块区域。由于 没有话任何的线段时,圆内的区域数为11,因此最终总的区域数就是11加上所有交点的个数,再加上所有线段的数量,也就是Cn4+Cn2+1C_{n}^{4}+C_{n}^{2}+1了。

关键在于,Cn4+Cn2+1C_{n}^{4}+C_{n}^{2}+1又可以写成Cn14+Cn13+Cn12+Cn11+1C_{n-1}^{4}+C_{n-1}^{3}+C_{n-1}^{2}+C_{n-1}^{1}+1,也就是杨辉三角第n行的前5个数之和。由于杨辉三角前55行都没超过55个数,因此nn是小于等于5的正整数是,Cn14+Cn13+Cn12+Cn11+1C_{n-1}^{4}+C_{n-1}^{3}+C_{n-1}^{2}+C_{n-1}^{1}+1就相当于是杨辉三角第nn行所有数全部相加的结果。而杨辉三角第n行的所有数之和正好就是2n12^{n-1},于是便诞生 了数学中最具误导性的“违规律”。

PS: solution 摘自顾森《思考的乐趣:Matrix67数学笔记》之《30.欧拉公式的另类证法和出人意料的应用》,这大概是我目前读的最懂的一篇证明,写的简单易懂,而又不失严谨,比出题人高到不知哪里去了,所以摘了过来。

如有雷同,不是巧合;如有侵权,请联系Apojacsleam(QQ1729338463)删除。

T7异或

若一共有kk条鱼,考虑第kk条鱼,如果第k1k-1条鱼睡着了,第kk条鱼可以肆 无忌惮地吃掉第k1k-1条鱼,所以第k1k-1条鱼不敢吃掉第k2k-2条鱼,那么第k2k-2条鱼 就可以肆无忌惮地吃掉第k3k-3条鱼,以此类推,得到若鱼群数量为奇数,则第TbGx就可以肆无忌惮地吃食物,否则就不敢吃。 于是问题转化成了:求Fibnacci 数列前n项有多少项是奇数。 所以答案是:[23n]\left[\frac{2}{3} n\right]

T8最大公约数

用欧几里德算法求一下gcd(a,b)gcd(a,b),然后用lcmgcd=ablcm*gcd=a*b求解即可。 由于数据范围,所以需要先约分。

T9区间

有多少人去写线段树板子了?在群里举个手可好?

这是一道前缀和的板子题。

因为Query操作在最后,且只有一次,所以只需要开一个数组记录所有的区间修改情况,最后用前缀和求解即可,时空复杂度都为Θ(N)\Theta(N)

需要说明的是,由于所有输入数据都在int内,所以不能保证int范围不会爆,只能开long long。 线段树需要开4倍空间,32M的空间会略显不足。

本来时间限制是15,为了照顾java选手,改成了两秒,不然卡线段树Θ(nlogn)\Theta(n \log n)还是可以的。

T10时间

我可能缺一道真签到题。 提前记录一天中所有的回文时间,打表模拟即可。 要注意,输入数据可能有前导o,也可能没有,C++选手可以用scanf("%d:%d",hour,min);来输入。