南京赛区题目重现
1001.令Ex表示从开始掷骰子到结束得到的期望值,假设涂色的筛子是1,2,3...m,那么 有 Ex = 1/n*(a[1]+Ex) + 1/n*(a[2] + Ex) +...1/n*(a[m]+Ex) + 1/n*a[m+1]+...1/n*a[n]
化简得 Ex = sum{a[i]}/(n-m);
P.s. n==m的时候未必就是inf,比如,sum{a[i]} == 0...
1003.求 a+...+b的过程中有几次二进制进位。把区间[a,b]中每个数写成二进制形式,然后末尾对齐来个 b-a+1个数的二进制加法模拟即可。当然不是暴力。对于二进制的第i位,先算出[a,b]内有多少个数的二进制形式在该位是 1。这一问题满足区间减法,所以求出[0,a-1]和[0,b]内的个数做差即可。
1011.鲁莽了,之前的想法没太透彻就敲了,导致这题当时没A掉。结果比想象的简单。考虑 x[i] 和 x[j].他们能构成绝对威胁当且仅当 :存在非负整数 ki,kj
st: id == ki*x[i] + r[i] == kj*x[j] + r[j] { y[i] <= r[i] <= z[i], y[j] <= r[j] <= z[j] }
即 ki*x[i] - kj*x[j] = p; { y[j] - z[i] <= p == r[j] - r[i] <= z[j] - y[i] } (1)
这个方程有解当且仅当gcd(x[i],x[j])能整除p,所以在 p的范围内一定要存在gcd(x[i],x[j] 的倍数。
此外还要保证 ki, kj 的非负性。万一 ki , kj 都是 负的但是 p 是正的,那也是不行的。
用欧几里得算法可以求出 X, Y st:X * x[i] + Y * x[j] = gcd( x[i], x[j] ); (2)
因为 gcd( x[i], x[j] ) 能整除 p ,这样就能由 (2) 构造出 (1)从而判断 ki,kj的正负了。