TopCoder SRM569 题解

来源:互联网 发布:access数据库设计实例 编辑:程序博客网 时间:2024/05/29 14:01

这场考得跟什么一样的……rating怒跌300+……

翻译向。官方题解:http://apps.topcoder.com/wiki/display/tc/SRM+569


250pts:

题意:有一台机器,给定两个长度为N的01串作为输入,分别对每一位进行与、或、异或中的一种操作,输出操作后的串。先给定M个01串,问至少要添加几个串,才能判断出机器对每一位分别进行什么操作。

分析:显然位与位之间互相独立,那么单独考虑一位,这是只有三种输入:(0,0),(0,1),(1,1)。能区别AND和OR的有(0,1);能区别AND和XOR的有(0,1)和(1,1);能区别OR和XOR的有(1,1)。只要分别统计M个串中每一位0和1的个数,再判断一下即可。答案不会超过2。


500pts:

题意:一栋大楼共N层(0~N-1),第i层有a[i]个人。每层都要分配a[i]/k取上整个城管来管这些人。第i层楼的人可以在第i层、i+1层或者i-1层中的某一层楼,求最少需要几个城管来管所有人。

分析:如果某一层的人数不是K的整数倍,那么我们可以将上下层多出的人移到该层。考虑第i-1、i和i+1层之间的关系。i-1->1和i+1->i可以视为i->i-1和i+1->i-1。假设只有i和i-1,那么双向的移动是等价的。三层楼之间互相影响只有上下两层都集中的一层这种情况(这和一层分散到两层是等价的),也与i+1->i-1等价。那么就有这样一个贪心策略:从0层开始,计算0层需要几个城管,以及0层还能移入几个人,即为rem,然后从1层往0层移不超过rem的尽量多的人。如果此时移入的人还不超过rem(也即1层的人数少于rem),就从2层继续移。之后把1层视为新的0层,再重新开始。


1000pts:

题意:定义n!k=n!(k-1)*(n-1)!k,边界条件0!k=1,n!0=n。求N!K在B进制下末尾有几个0。N≤10^9,K≤16,2≤B≤10。

分析:首先有公式(狗眼可得)

对于B=2,3,5,7的情况,即统计N!K含有几个B的因子;B=4,8,9即B=2^2,2^3,3^2,对应(B=2)/2,(B=2)/3,(B=3)/2;B=6,10对应min((B=2),(B=3)),min((B=2),(B=5)0。

考虑B=2。令f(n,k)为n!k中2的因子个数,t(x)为数x中2的因子个数,有f(0,k)=0、f(n,0)=t(n)、f(n,k)=f(n-1,k)+f(n,k-1)。如果构造矩阵从V(i)=[f(i,0), f(i,1), ..., f(i,k)]转移到V(i+1)=[f(i+1,0), f(i+1,1), ..., f(i+1,k)],会发现矩阵中含有t(i),故无法快速幂。

研究t(x)的规律。可以发现t(1..2^p-1)和t(2^p+1...2^(p+1)-1)是相同的。令A(i)为含有t(x)=i的矩阵,设V(0)*B(i)=V(i),那么B(i)=A(t(1))*A(t(2))*..*A(t(i))。假设i=2^p-1,那么B(i)=B((i+1)/2-1)*A((i+1)/2)*B((i+1)/2-1)。这样还是可以在O(logN)的时间内转移到V(N),也就可以快速求出答案。对于B=3、5、7也有类似的规律。

原创粉丝点击