BZOJ2655: calc(dp 拉格朗日插值)】的更多相关文章

题意 题目链接 Sol 首先不难想到一个dp 设\(f[i][j]\)表示选了\(i\)个严格递增的数最大的数为\(j\)的方案数 转移的时候判断一下最后一个位置是否是\(j\) \[f[i][j] = f[i][j - 1] + f[i - 1][j - 1] * j\] for(int i = 0; i <= A; i++) f[0][i] = 1; for(int i = 1; i <= N; i++) for(int j = 1; j <= A; j++) f[i][j] = a…
BZOJ2655 Calc 参考 题意: 给定n,m,mod,问在对mod取模的背景下,从[1,m]中选出n个数相乘可以得到的总和为多少. 思路: 首先可以发现dp方程 ,假定dp[m][n]表示从[1 ~ m]中选出n个数乘积的和, 那么dp[m][n] = dp[m-1][n] + dp[m-1][n-1]*m*n. 但是这道题的m有1e9那么大,不能dp完,不过我们可以发现,dp[x][n] 是关于x的2*n多项式, 所以,我们只要先求出0~2*n的dp值,再用拉格朗日插值法算出dp[m]…
[BZOJ2655]Calc(多项式插值,动态规划) 题面 BZOJ 题解 考虑如何\(dp\) 设\(f[i][j]\)表示选择了\(i\)个数并且值域在\([1,j]\)的答案. \(f[i][j]=f[i-1][j-1]*i*j+f[i][j-1]\) 即不考虑选择\(j\),以及当前选择\(j\),那么枚举是哪个数,转移即可. 时间复杂度\(O(An)\). 碰到这种东西我们直接假装它是一个若干次的多项式. 先假设是个\(n\)次多项式,发现不对, 再试试\(2n\)次多项式,恩,很对,…
bzoj 题意: 给出\(n\),现在要生成这\(n\)个数,每个数有一个值域\([1,A]\).同时要求这\(n\)个数两两不相同. 问一共有多少种方案. 思路: 因为\(A\)很大,同时随着值域的不断增加,感觉最终的答案像个多项式,又因为\(0\leq A\leq n\)时的答案很显然..所以猜一发这是一个最高项次数为\(2n\)的多项式,然后拉格朗日插值搞就行了(滑稽). 求方案数的时候\(dp\)来求(我好像是乱搞搞出来的). /* * Author: heyuhhh * Created…
[题意]一个序列$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个位置可以插入,即:…
这个题我们首先可以dp,f[i][j]表示前i个科目恰好碾压了j个人的方案数,然后进行转移.我们先不考虑每个人的分数,先只关心和B的相对大小关系.我们设R[i]为第i科比B分数少的人数,则有f[i][j]=sum f[i-1][k]*C(k,j)*C(n-1-k,R[i]-j)  (k>=j) 怎么解释呢,首先前i-1科有k个人已经被碾压,k肯定大于等于j,然后考虑当前这一科有j个人被碾压,那么就需要从k个人中选出j个来即C(k,j),然后从剩下的有R[i]-j个人比B考的少,这些人必须是之前i…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4559 看了看拉格朗日插值:http://www.cnblogs.com/ECJTUACM-873284962/p/6833391.html https://blog.csdn.net/lvzelong2014/article/details/79159346 https://blog.csdn.net/qq_35649707/article/details/78018944 还只会最简单的…
传送门 设\(dp[i][j]\)为考虑\(i\)个数,其中最大值不超过\(j\)的答案,那么转移为\[dp[i][j]=dp[i-1][j-1]\times i\times j+dp[i][j-1]\] 即最大值不超过\(j-1\)的答案加上最大值刚好为\(j\)的答案,乘上\(i\)是因为\(j\)可以放在\(i\)个数里随便哪个位置 考虑把转移拆开\[dp[i][j]=\sum_{k=0}^{j-1}dp[i-1][k]\times i\times (k+1)\] 如果把\(i\)看成列,…
bzoj 题意: 有\(n\)位同学,\(m\)门课. 一位同学在第\(i\)门课上面获得的分数上限为\(u_i\). 定义同学\(A\)碾压同学\(B\)为每一课\(A\)同学的成绩都不低于\(B\)同学. 现在知道一个同学碾压了\(k\)个人,同时已知其各个科目的排名\(r_i\),问有多少种情况满足这个说法. 思路: 考虑按照每一科一个一个来考虑,\(dp[i][j]\)表示前\(i\)门课碾压\(j\)个人的情况数. 那么有转移\(dp[i][j]=\sum dp[i-1][k]\cdo…
题意:一个数,每个节点取值是1-d,父亲比儿子节点值要大,求方案数 题解:\(dp[u][x]=\prod_{v}\sum_{i=1}^xdp[v][i]\),v是u的子节点,先预处理出前3000项,如果d大于3000,用这些结果插值即可 //#pragma GCC optimize(2) //#pragma GCC optimize(3) //#pragma GCC optimize(4) //#pragma GCC optimize("unroll-loops") //#pragm…