【BZOJ】2655: calc 动态规划+拉格朗日插值

【题意】一个序列$a_1,...,a_n$合法当且仅当它们都是[1,A]中的数字且互不相同,一个序列的价值定义为数字的乘积,求所有序列的价值和。n<=500,A<=10^9,n+1<A<mod<=10^9,mod是素数。

【算法】动态规划+拉格朗日插值

【题解】这道题每个数字的贡献和序列选了的数字积关系密切,所以不能从序列角度考虑(和具体数字关系不大)。

设$f_{n,m}$表示前n个数字(值域)中取m个数字的答案,那么枚举取或不取数字n,取n时乘n且有j个位置可以插入,即:

$$f_{i,j}=f_{i-1,j}+f_{i-1,j-1}*i*j$$

答案是$f_{A,n}$。这里最后再乘n!应该也是可以的,但是就不能插值了233。

打表法找规律见:【BZOJ2655】calc DP 数学 拉格朗日插值 by yww

观察法:假装正经地观察一下这个式子,下标j从j-1转移并乘上j,那么每次就多一个次数。但为什么最后要翻个倍就不是很清楚了。

不过拉格朗日插值插多了也没关系,所以可以通过对拍尝试小数据来试出最小插值。

复杂度O(n^2+n)。

 

posted @ 2018-04-19 20:55  ONION_CYC  阅读(...)  评论(...编辑  收藏