2019.02.19 bzoj2655: calc(生成函数+拉格朗日插值)

时间:2022-09-09 11:51:46

传送门

题意简述:问有多少数列满足如下条件:

  1. 所有数在[1,A][1,A][1,A]之间。
  2. 没有相同的数
  3. 数列长度为nnn

一个数列的贡献是所有数之积,问所有满足条件的数列的贡献之和。

A≤1e9,n≤500A\le1e9,n\le500A≤1e9,n≤500


思路:

肯定不能枚举所有情况。

我们先规定这个数列满足a1&lt;a2&lt;⋅˙⋅⋅&lt;ana_1&lt;a_2&lt;\dot\cdot\cdot\cdot&lt;a_na1​<a2​<⋅˙⋅⋅<an​,最后答案乘上n!n!n!即可。

现在转化一下问题:

就是求f(x)=∏i=1A(1+ix)f(x)=\prod_{i=1}^A(1+ix)f(x)=∏i=1A​(1+ix)这个多项式的xnx^nxn的系数是多少。

考虑定义状态fi,jf_{i,j}fi,j​表示多项式∏k=1i(1+kx)\prod_{k=1}^i(1+kx)∏k=1i​(1+kx)这个多项式xjx^jxj的系数。

于是有下面的转移:

fi,j=ifi−1,j−1+fi−1,jf_{i,j}=if_{i-1,j-1}+f_{i-1,j}fi,j​=ifi−1,j−1​+fi−1,j​ 可以暴力走一波了

然后把后面一项展开变成:

fi,j=ifi−1,j−1+(i−1)fi−2,j−1+fi−2,j=⋅˙⋅⋅=∑k=0i−1(k+1)fk,j−1f_{i,j}=if_{i-1,j-1}+(i-1)f_{i-2,j-1}+f_{i-2,j}=\dot\cdot\cdot\cdot=\sum_{k=0}^{i-1}(k+1)f_{k,j-1}fi,j​=ifi−1,j−1​+(i−1)fi−2,j−1​+fi−2,j​=⋅˙⋅⋅=∑k=0i−1​(k+1)fk,j−1​

这说明fi,jf_{i,j}fi,j​可以等于一个多项式。

相当于对于一个矩阵的某一行集体乘上一个数,然后用前缀和去更新当前状态。

于是f∗,jf_{*,j}f∗,j​对应多项式的最高次数等于f∗,j−1f_{*,j-1}f∗,j−1​对应多项式的最高次数+2+2+2,这样递推下去f∗,jf_{*,j}f∗,j​对应多项式的最高次数是2j2j2j。

这样我们知道了fn,kf_{n,k}fn,k​对应的多项式次数是2k2k2k,于是先暴力dpdpdp出f1→2k+1,kf_{1\rightarrow 2k+1,k}f1→2k+1,k​的值,然后用拉格朗日插值算出第nnn项即可。

代码:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int N=1005;
int A,f[N][N],inv[N],n,k,mod,ans=0;
typedef long long ll;
inline int add(const int&a,const int&b){return a+b>=mod?a+b-mod:a+b;}
inline int dec(const int&a,const int&b){return a>=b?a-b:a-b+mod;}
inline int mul(const int&a,const int&b){return (ll)a*b%mod;}
int main(){
	scanf("%d%d%d",&A,&n,&mod);
	int lim=n*2+1;
	inv[1]=1;
	for(ri i=2;i<=lim;++i)inv[i]=mul(inv[mod-mod/i*i],mod-mod/i);
	f[0][0]=1;
	for(ri i=1;i<=lim;++i){
		f[i][0]=1;
		for(ri j=1;j<=n;++j)f[i][j]=add(f[i-1][j],mul(f[i-1][j-1],i));
	}
	for(ri mult,i=1;i<=lim;++i){
		mult=f[i][n];
		for(ri j=1;j<=lim;++j)if(i^j)mult=mul(mult,dec(A,j)),mult=mul(mult,(i>j?inv[i-j]:mod-inv[j-i]));
		ans=add(ans,mult);
	}
	for(ri i=1;i<=n;++i)ans=mul(ans,i);
	cout<<ans;
	return 0;
}

2019.02.19 bzoj2655: calc(生成函数+拉格朗日插值)的更多相关文章

  1. BZOJ2655&colon; calc&lpar;dp 拉格朗日插值&rpar;

    题意 题目链接 Sol 首先不难想到一个dp 设\(f[i][j]\)表示选了\(i\)个严格递增的数最大的数为\(j\)的方案数 转移的时候判断一下最后一个位置是否是\(j\) \[f[i][j] ...

  2. 【BZOJ2655】calc(拉格朗日插值)

    bzoj 题意: 给出\(n\),现在要生成这\(n\)个数,每个数有一个值域\([1,A]\).同时要求这\(n\)个数两两不相同. 问一共有多少种方案. 思路: 因为\(A\)很大,同时随着值域的 ...

  3. 【BZOJ2655】Calc(拉格朗日插值,动态规划)

    [BZOJ2655]Calc(多项式插值,动态规划) 题面 BZOJ 题解 考虑如何\(dp\) 设\(f[i][j]\)表示选择了\(i\)个数并且值域在\([1,j]\)的答案. \(f[i][j ...

  4. 【BZOJ】2655&colon; calc 动态规划&plus;拉格朗日插值

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

  5. BZOJ2655 Calc - dp 拉格朗日插值法

    BZOJ2655 Calc 参考 题意: 给定n,m,mod,问在对mod取模的背景下,从[1,m]中选出n个数相乘可以得到的总和为多少. 思路: 首先可以发现dp方程 ,假定dp[m][n]表示从[ ...

  6. P4463 &lbrack;国家集训队&rsqb; calc(拉格朗日插值)

    传送门 设\(dp[i][j]\)为考虑\(i\)个数,其中最大值不超过\(j\)的答案,那么转移为\[dp[i][j]=dp[i-1][j-1]\times i\times j+dp[i][j-1] ...

  7. 拉格朗日插值&amp&semi;&amp&semi;快速插值

    拉格朗日插值 插值真惨 众所周知$k+1$个点可以确定一个$k$次多项式,那么插值就是通过点值还原多项式的过程. 设给出的$k+1$个点分别是$(x_0,y_0),(x_1,y_1),...,(x_k ...

  8. 【BZOJ2655】calc DP 数学 拉格朗日插值

    题目大意 ​ 一个序列\(a_1,\ldots,a_n\)是合法的,当且仅当: ​ 长度为给定的\(n\). ​ \(a_1,\ldots,a_n\)都是\([1,m]\)中的整数. ​ \(a_1, ...

  9. EOJ Monthly 2019&period;11 E&period; 数学题(莫比乌斯反演&plus;杜教筛&plus;拉格朗日插值)

    传送门 题意: 统计\(k\)元组个数\((a_1,a_2,\cdots,a_n),1\leq a_i\leq n\)使得\(gcd(a_1,a_2,\cdots,a_k,n)=1\). 定义\(f( ...

随机推荐

  1. python --enable-shared

    https://github.com/docker-library/python/issues/21 例如编译安装python3.5.2,脚本如下: wget https://s3.cn-north- ...

  2. MySQL - 常用命令及常用查询SQL

    常用查询SQL #查看临时目录 SHOW VARIABLES LIKE '%tmp%'; #查看当前版本 SELECT VERSION(); 常用命令 #查看当前版本,终端下未进入mysql mysq ...

  3. Oracle游标总结

    1.声明游标 declare teacher_id ); teacher_name ); teacher_title ); teacher_sex ); cursor teacher_cur is ; ...

  4. SPRING IN ACTION 第4版笔记-第七章Advanced Spring MVC-005- 异常处理&commat;ResponseStatus、&commat;ExceptionHandler、&commat;ControllerAdvice

    No matter what happens, good or bad, the outcome of a servlet request is a servlet response. If an e ...

  5. 依赖于设备的位图&lpar;DDB&rpar; &comma;CreateCompatibleBitmap用法

    DDB(Device-dependent bitmap)依赖于具体设备,这主要体现在以下两个方面: DDB的颜色模式必需与输出设备相一致.例如,如果当前的显示设备是256色模式,那么DDB必然也是25 ...

  6. &lbrack;转&rsqb;Installing Snow Leopard &lpar;Client&rpar; on VMware Fusion 6&period;0&period;3

    Source: http://inficererk.wordpress.com/2014/05/29/installing-snow-leopard-client-on-vmware-fusion-6 ...

  7. 优化のzencart URL &amp&semi;zenid&equals;&period;&period;&period;&period;&period;

    zencart URL后面带有一串&zenid=.....解决方案 发布时间:2013年3月16日 次浏览:106 经木木测试,此方法可用. ================= 最近一个客户的 ...

  8. SQLI DUMB SERIES-18

    (1)对username和password无论怎么输入,都没有回显,再看题目,POST - Header Injection - Uagent field - Error based (基于错误的用户 ...

  9. php面向对象高级-魔术方法与迭代器

    1,魔术方法__set与__get, __call >这些魔术方法,将在相关的属性或者方法不存在时调用 >函数原型 .function __set( $property, $value ) ...

  10. Androoid studio 2&period;3 AAPT err&lpar;Facade for 596378712&rpar;&colon; &bsol;&bsol;&quest;&bsol;C&colon;&bsol;Users&bsol;中文文件夹&bsol;&period;android&bsol;build-cache

    错误如下: Error:Some file crunching failed, see logs for details Error:Execution failed for task ':app:m ...