第一题:
设 S(N)表示 N 的各位数字之和,如 S(484)=4+8+4=16,S(22)=2+2=4。如果一个正整数 x满足 S(x*x)=S(x)*S(x),我们称 x 为 Rabbit Number。比方说,22 就是一个 Rabbit Number,因为 S(484)=S(22)*S(22)。
现在,给出一个区间[L,R],求在该区间内的 Rabbit Number 的个数。 1≤L≤R≤10^9
解题过程:
1.首先爆搜把表给打了出来([1,10^9] 跑了5分钟)。。然后发现所有的rabbit number 各个数位不会超过3。。 不会严谨的证明,但是想想应该是对的。。
设数X某一位是 5 ,5*5=25, 那么数字5对(S(X*X))贡献值是2+5=7远小于25。
2.那么枚举9位的4进制数即可。。还有一个10位数10^9也是rabbit number。 时间复杂度(4^9)轻松过。
3.题解上说一个数是rabbit number 当且仅当平方的时候没有出现进位,不知道为什么。。。不过枚举的方法已经够快了。
初始得分100.
第二题:
题目大意:给出A,B, 两个人轮流,每次给A或者B 加上1,如果 AB 大于给定的N就输了。。判断必胜者或者平局。1≤N≤10^8
解题过程:
1.首先容易看出这是个博弈问题,且状态集有限。
2.直接根据必胜态必败态来保存状态。F[i][j]表示当轮到某个人时,A=i,B=j,他是必胜还是必败。。 根据“一个状态是必败态当且仅当它的所有后继是必胜态”的原则转移状态。
3.细节处理:当B=1的时候,有可能两个人一直轮流给A+1,那么递归太多,系统栈就要爆掉了。所以加一个奇偶性剪枝,当B=1 && A*A>N的时候,肯定不会去+B,不然就输了。所以根据(N-A)的奇偶性就可以提前判断谁必胜了。。(不过极限数据还是会卡掉的,N=10^8,A=B=1)最多要递归10^4层。
4.最好其实还是用递推来写。不过记忆化也能AC。。没有极限数据。
初始得分0分。
第三题:
题目描述:在一条数轴上有 N 个点,分别是 1~N。一开始所有的点都被染成黑色。接着我们进行 M 次操作,第 i 次操作将[Li,Ri]这些点染成白色。请输出每个操作执行后剩余黑色点的个数。
解题过程:
1.裸的线段树额。不过要打个lazy_tag。
2.其实可以不用打lazy_tag,因为没有删除操作,那么如果当前区间已经被完全覆盖过了,那么就可以直接return了。速度比lazy_tag版本的快一半。。(好吧其实是懒,连懒人标记都懒得写了。)