2019.02.19 bzoj2655: calc(生成函数+拉格朗日插值)
传送门
题意简述:问有多少数列满足如下条件:
- 所有数在[1,A][1,A][1,A]之间。
- 没有相同的数
- 数列长度为nnn
一个数列的贡献是所有数之积,问所有满足条件的数列的贡献之和。
A≤1e9,n≤500A\le1e9,n\le500A≤1e9,n≤500
思路:
肯定不能枚举所有情况。
我们先规定这个数列满足a1<a2<⋅˙⋅⋅<ana_1<a_2<\dot\cdot\cdot\cdot<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(生成函数+拉格朗日插值)的更多相关文章
- BZOJ2655: calc(dp 拉格朗日插值)
题意 题目链接 Sol 首先不难想到一个dp 设\(f[i][j]\)表示选了\(i\)个严格递增的数最大的数为\(j\)的方案数 转移的时候判断一下最后一个位置是否是\(j\) \[f[i][j] ...
- 【BZOJ2655】calc(拉格朗日插值)
bzoj 题意: 给出\(n\),现在要生成这\(n\)个数,每个数有一个值域\([1,A]\).同时要求这\(n\)个数两两不相同. 问一共有多少种方案. 思路: 因为\(A\)很大,同时随着值域的 ...
- 【BZOJ2655】Calc(拉格朗日插值,动态规划)
[BZOJ2655]Calc(多项式插值,动态规划) 题面 BZOJ 题解 考虑如何\(dp\) 设\(f[i][j]\)表示选择了\(i\)个数并且值域在\([1,j]\)的答案. \(f[i][j ...
- 【BZOJ】2655: calc 动态规划+拉格朗日插值
[题意]一个序列$a_1,...,a_n$合法当且仅当它们都是[1,A]中的数字且互不相同,一个序列的价值定义为数字的乘积,求所有序列的价值和.n<=500,A<=10^9,n+1< ...
- BZOJ2655 Calc - dp 拉格朗日插值法
BZOJ2655 Calc 参考 题意: 给定n,m,mod,问在对mod取模的背景下,从[1,m]中选出n个数相乘可以得到的总和为多少. 思路: 首先可以发现dp方程 ,假定dp[m][n]表示从[ ...
- P4463 [国家集训队] calc(拉格朗日插值)
传送门 设\(dp[i][j]\)为考虑\(i\)个数,其中最大值不超过\(j\)的答案,那么转移为\[dp[i][j]=dp[i-1][j-1]\times i\times j+dp[i][j-1] ...
- 拉格朗日插值&&快速插值
拉格朗日插值 插值真惨 众所周知$k+1$个点可以确定一个$k$次多项式,那么插值就是通过点值还原多项式的过程. 设给出的$k+1$个点分别是$(x_0,y_0),(x_1,y_1),...,(x_k ...
- 【BZOJ2655】calc DP 数学 拉格朗日插值
题目大意 一个序列\(a_1,\ldots,a_n\)是合法的,当且仅当: 长度为给定的\(n\). \(a_1,\ldots,a_n\)都是\([1,m]\)中的整数. \(a_1, ...
- EOJ Monthly 2019.11 E. 数学题(莫比乌斯反演+杜教筛+拉格朗日插值)
传送门 题意: 统计\(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( ...
随机推荐
- startup.bat 一闪而过解决方案
原文地址:http://blog.csdn.net/stypace/article/details/38083581 启动tomcat时cmd窗口一闪而过解决方法. 注: 我这边只是配置了环境变量就o ...
- Deployment Descriptor Web.xml
Deployment Descriptor部署描述符: - 部署描述符是要部署到Web容器或EJB容器的Web应用程序或EJB应用程序的配置文件. - 部署描述符应包含EJB应用程序中所有企业bean ...
- denyhosts、中文文档乱码、端口占用查询
1.安装 denyhosts, 设置 hosts.allow ,系统自动将攻击的ip 添加如 hosts.deny2.打开中文文档乱码, 将文档下载到windows, 通过富文本编辑器查看文档编码3. ...
- 字符串格式化:f-strings
字符串格式化一般使用: {}.format 和 %s 那么python 3.6以后新加的一个功能就是: value=“zhang”f“string{value}” # 他的主要功能就是对于我们的f或F ...
- Vue 折叠面板Collapse在标题上添加组件后,阻止面板冒泡的用法
iView组件中,折叠面板Collapse点击面板标题部分,会出现面板收起或展开的效果.那么在面板标题后面再添加下拉框之类的组件时,会出现跟面板点击一样的效果,这时候就需要阻止冒泡的用法了.具体代码: ...
- python_05 可变类型与不可变类型、集合、字符串格式化
可变数据类型与不可变数据类型: 1.可变:列表,字典 2.不可变:字符串,数字,元组 访问顺序: 1.顺序访问:字符串,列表,元组 2.映射:字典 集合 由不同元素组成的集合,集合中是一组无序排列的可 ...
- JavaScript: Constructor and Object Oriented Programming
Constructor : Grammar: object.constructor Example: Javascript code: 1 function obj1() { this.number ...
- sublime3支持es6语法和vue彩色显示
支持ES6语法设置: 首先安装nodejs 当然你可以使用其它诸如jsc之类的环境来运行js, 本文使用的是nodejs. 首先确保你的电脑已经安装好nodejs, 并已将其添加到环境变量中 (一般安 ...
- 【原】 The Linux Command Line- pwd,cd,ls,file,less
pwd - print name of current working directory. cd - change directory ls - list directory contents fi ...
- SSM商城项目(九)
1. 学习计划 1.Activemq整合springMQ的应用场景 2.添加商品同步索引库 3.商品详情页面动态展示 4.展示详情页面使用缓存 2. Activemq整合spring 2.1. ...