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

http://www.lydsy.com/JudgeOnline/problem.php?id=2655 f[i][j] 表示[1,i]里选严格递增的j个数,序列值之和 那么ans=f[A][n] *  n! A太大,那么用拉格朗日插值法 f[i][j] 是关于i的2j次多项式,证明如下: %%%rqy #include<cstdio> using namespace std; int mod; ][]; ],y[],tot; int Pow(int a,int b) { ; ) ) res=…
LINK:calc 容易得到一个nk的dp做法 同时发现走不通了 此时可以考虑暴力生成函数. 不过化简那套不太熟 且最后需要求多项式幂级数及多项式exp等难写的东西. 这里考虑观察优化dp的做法. 不容易看出 f(n,k)是关于k的2n+1次多项式. 证明可以用数学归纳法证明 且还可以从非常规律的转移中看出这应该是一个形似多项式的东西. 可以直接O(n)拉格朗日插值 不过这里懒得写因为 外面dp是\(n^2\)求点值的所以这里没必要O(n). 注意初始化. const ll MAXN=1010;…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2655 先设 f[i][j] 表示长度为 i 的序列,范围是 1~j 的答案: 则 f[i][j] = f[i-1][j-1] * i * j + f[i][j-1],分别是选不选 j,选 j 的话放在哪个位置: 看不出次数...据说这是个最高次数为 2i 的多项式,感性理解... 知道了次数,就可以用拉格朗日插值算了,DP得到比较小的 2*n+1 个值,即可算出 x=A 的答案. 代码如下…
传送门 解题思路 首先比较容易能想到\(dp\),设\(f[i][j]\)表示前\(j\)个数,每个数\(<=i\)的答案,那么有转移方程:\(f[i][j]=f[i-1][j-1]*i*j+f[i-1][j]\).这个转移复杂度是\(O(n*A)\)的,无法通过此题.考虑优化,打个表发现这其实是一个多项式,次数可以用差分法确定,然后用拉格朗日插值即可. 代码 #include<iostream> #include<cstdio> #include<cstring>…
2655: calc Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 428  Solved: 246[Submit][Status][Discuss] Description 一个序列a1,...,an是合法的,当且仅当: 长度为给定的n. a1,...,an都是[1,A]中的整数. a1,...,an互不相等. 一个序列的值定义为它里面所有数的乘积,即a1a2...an. 求所有不同合法序列的值的和. 两个序列不同当且仅当他们任意一位不一样.…
calc Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 377  Solved: 226[Submit][Status][Discuss] Description 一个序列a1,...,an是合法的,当且仅当: 长度为给定的n. a1,...,an都是[1,A]中的整数. a1,...,an互不相等. 一个序列的值定义为它里面所有数的乘积,即a1a2...an. 求所有不同合法序列的值的和. 两个序列不同当且仅当他们任意一位不一样. 输出答案对一…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2655 先考虑DP.dp[ i ][ j ]表示值域为 i .选 j 个值的答案,则 dp[ i ][ j ] = dp[ i-1 ][ j ] + dp[ i-1 ][ j-1] * i * j .两项分别表示一定不选/一定选第 i 个值. 因为答案是值域大.个数小,所以考虑只看 dp[ ][ n ] ,即把值域看成自变量. 不知怎么知道这个式子的次数是 2*n .尝试用做几遍差分看什么时…
[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,\ldots,a_n\)是合法的,当且仅当: ​ 长度为给定的\(n\). ​ \(a_1,\ldots,a_n\)都是\([1,m]\)中的整数. ​ \(a_1,\ldots,a_n\)互不相等. ​ 一个序列的值定义为它里面所有数的乘积,即\(a_1\times a_2\times\cdots\times a_n\). 求所有不同合法序列的值的和. ​ 两个序列不同当且仅当他们任意一位不一样. ​ 输出答案对一个数\(p\)取余的结果. \(n\leq50…