这是这次NOIP比赛中的第四题,感觉有些难度。
题目大意:
有四个数A、B、C、D,满足以下条件:
①A<B<C<D
②(B-A)=2(D-C)
③3(B-A)<(C-B)
先说说80分的方法。
设CD之间的距离为i,则AB为2i,BC为6i+k (k>0)
所以,我们可以先把同一数值的数用一个数组存个数,然后枚举i、A和C。
重点是如何统计方案数。
设Wi表示数值为i的数出现次数。
则根据排列组合可以得知,A的次数就是Wb*Wc*Wd。
B就是Wa*Wc*Wd。
以此类推。
最后把每个数所对应的数组输出,就可以拿到80分。
(看懂了80分再看100分)
100分:
尝试把三重降到两重。
根据上面可以得知,我们其实只要枚举一个A和i,接下来把所有符合条件的CD求出计算。
可以用后缀和来实现这一想法。
设SUM[i]表示从i~n-i之间所有的CD对的乘积。
因为A和B是已知的,而CD却是不定的,所以先用后缀和求出A和B的方案数。
为了求出最多的方案数,假设k=1。
因为AB为2i,BC至少为6i+1,所以C至少为A+8i+1。
接下来再把之前的公式合并一下,就变成了这样:
方案数A=Wb*Sum[A+i*8+1](所有的Wc*所有的Wd)
同理,方案数B和方案A近似,只不过Wb要变成Wa。
接下来求CD的方案。
把刚才的方法改一下,用前缀和计算出所有的AB对的乘积,再枚举C的位置(D的话改一下也可以)
只不过A和B的距离为2i,所以计算前缀和时要这样算:
Sum[j]=Sum[j-1]+W[j]*W[j-2*I]
BC间隔至少为6i+1,所以B最大为C-6i-1。
所以C的方案数就是Wd*Sum[C-6*i-1](所有的Wa*所有的Wb)
D就不用讲了吧。
最后把每个A[i]对应的次数输出就行了。