【BZOJ2655】calc DP 数学 拉格朗日插值
题目大意
  一个序列\(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\leq500,m\leq {10}^9,p\leq{10}^9,n+1<m<p\)且\(p\)是质数。
题解
 这题做法很多种。
 设\(f_{i,j}\)为前\(i\)个数中选\(j\)个数的所有方案的值的和,容易得到递推式:\(f_{0,0}=1,f_{i,j}=f_{i-1,j-1}\times i\times j+f_{i-1,j}\)。最后\(ans=f_{m,n}\)。但是这题\(m\)很大,不能直接求出答案。怎么办呢?
 我们先打个表:
| \(f\) | \(0\) | \(1\) | \(2\) | 
|---|---|---|---|
| \(0\) | \(1\) | \(0\) | \(0\) | 
| \(1\) | \(1\) | \(1\) | \(0\) | 
| \(2\) | \(1\) | \(3\) | \(4\) | 
| \(3\) | \(1\) | \(6\) | \(22\) | 
| \(4\) | \(1\) | \(10\) | \(70\) | 
| \(5\) | \(1\) | \(15\) | \(170\) | 
| \(6\) | \(1\) | \(21\) | \(350\) | 
 什么?你看不出来?
| \(f\) | \(0\) | \(1\) | \(2\) | 
|---|---|---|---|
| \(0\) | \(1\) | \(0\) | \(0\) | 
| \(1\) | \(1\) | \(i\) | \(0\) | 
| \(2\) | \(1\) | \(2i-1\) | \(2i^2-2i\) | 
| \(3\) | \(1\) | \(3i-3\) | \(6i^2-12i+4\) | 
| \(4\) | \(1\) | \(4i-6\) | \(12i^2-36i+22\) | 
| \(5\) | \(1\) | \(5i-10\) | \(20i^2-80i+70\) | 
| \(6\) | \(1\) | \(6i-15\) | \(30i^2-150i+170\) | 
你还是看不出来?那我就直接告诉你吧。\(f_{i,0}=1,f_{i,1}=\frac12i^2-\frac12i,f_{i,2}=\frac14i^4+\frac16i^3-\frac14i^2-\frac16i\)。我们会发现,\(f_{i,j}\)是一个最高次项为\(2j\)的多项式,也就是说,\(f_{m,n}\)是一个最高次项为\(2n\)的多项式。我们只用求出\(0\)到\(2n\)次项的系数就可以求答案了。我们可以把前面\(0\)~\(2n\)个\(f_{i,n}\)求出来,就可以用拉格朗日插值插出多项式了。
 这道题因为是求某一个点的值,并不要求求出多项式,而且\(x\)取的是\([0,2n]\),所以可以\(O(n)\)求出答案。然而并没有什么用,因为前面的DP已经是\(O(n^2)\)的了。
 时间复杂度:\(O(n^2)\)
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<utility>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
ll p;
ll f[1010][1010];
ll fp(ll a,ll b)
{
	ll s=1;
	while(b)
	{
		if(b&1)
			s=s*a%p;
		a=a*a%p;
		b>>=1;
	}
	return s;
}
int main()
{
	int n,m;
	scanf("%d%d%lld",&m,&n,&p);
	int i,j;
	memset(f,0,sizeof f);
	f[0][0]=1;
	for(i=1;i<=2*n;i++)
	{
		f[i][0]=f[i-1][0];
		for(j=1;j<=n;j++)
			f[i][j]=(f[i-1][j-1]*i%p*j+f[i-1][j])%p;
	}
	if(m<=2*n)
	{
		printf("%lld\n",f[m][n]);
		return 0;
	}
	ll ans=0;
	for(i=0;i<=2*n;i++)
	{
		ll s1=1,s2=1;
		for(j=0;j<=2*n;j++)
			if(j!=i)
			{
				s1=(s1*(m-j))%p;
				s2=(s2*(i-j))%p;
			}
		ans=(ans+f[i][n]*s1%p*fp(s2,p-2)%p)%p;
	}
	ans=(ans%p+p)%p;
	printf("%lld\n",ans);
	return 0;
}
												
											【BZOJ2655】calc DP 数学 拉格朗日插值的更多相关文章
- 2019.02.19 bzoj2655: calc(生成函数+拉格朗日插值)
		
传送门 题意简述:问有多少数列满足如下条件: 所有数在[1,A][1,A][1,A]之间. 没有相同的数 数列长度为nnn 一个数列的贡献是所有数之积,问所有满足条件的数列的贡献之和. A≤1e9,n ...
 - BZOJ2655 Calc - dp 拉格朗日插值法
		
BZOJ2655 Calc 参考 题意: 给定n,m,mod,问在对mod取模的背景下,从[1,m]中选出n个数相乘可以得到的总和为多少. 思路: 首先可以发现dp方程 ,假定dp[m][n]表示从[ ...
 - BZOJ2655 calc(动态规划+拉格朗日插值法)
		
考虑暴力dp:f[i][j]表示i个数值域1~j时的答案.考虑使其值域++,则有f[i][j]=f[i][j-1]+f[i-1][j-1]*i*j,边界f[i][i]=i!*i!. 注意到值域很大,考 ...
 - 51nod1229-序列求和V2【数学,拉格朗日插值】
		
正题 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=1229 题目大意 给出\(n,k,r\)求 \[\sum_{i=1}^ni ...
 - BZOJ2655: calc(dp 拉格朗日插值)
		
题意 题目链接 Sol 首先不难想到一个dp 设\(f[i][j]\)表示选了\(i\)个严格递增的数最大的数为\(j\)的方案数 转移的时候判断一下最后一个位置是否是\(j\) \[f[i][j] ...
 - 【BZOJ】2655: calc 动态规划+拉格朗日插值
		
[题意]一个序列$a_1,...,a_n$合法当且仅当它们都是[1,A]中的数字且互不相同,一个序列的价值定义为数字的乘积,求所有序列的价值和.n<=500,A<=10^9,n+1< ...
 - 【BZOJ2655】Calc(拉格朗日插值,动态规划)
		
[BZOJ2655]Calc(多项式插值,动态规划) 题面 BZOJ 题解 考虑如何\(dp\) 设\(f[i][j]\)表示选择了\(i\)个数并且值域在\([1,j]\)的答案. \(f[i][j ...
 - BZOJ.2655.calc(DP/容斥 拉格朗日插值)
		
BZOJ 洛谷 待补.刚刚政治会考完来把它补上了2333.考数学去了. DP: 首先把无序化成有序,选严格递增的数,最后乘个\(n!\). 然后容易想到令\(f_{i,j}\)表示到第\(i\)个数, ...
 - 【BZOJ2655】calc(拉格朗日插值)
		
bzoj 题意: 给出\(n\),现在要生成这\(n\)个数,每个数有一个值域\([1,A]\).同时要求这\(n\)个数两两不相同. 问一共有多少种方案. 思路: 因为\(A\)很大,同时随着值域的 ...
 
随机推荐
- H5 26-CSS三大特性之优先级
			
26-CSS三大特性之优先级 类>标签>通配符>继承>浏览器默认 --> 0 我是段落 <!DOCTYPE html> <html lang=" ...
 - MySql实现分页查询的SQL,mysql实现分页查询的sql语句
			
一:分页需求: 客户端通过传递start(页码),limit(每页显示的条数)两个参数去分页查询数据库表中的数据,那我们知道MySql数据库提供了分页的函数limit m,n,但是该函数的用法和我们的 ...
 - PS调出水彩画效果古装人物照片
			
首先在PS里操作: 1.磨皮液化 磨皮液化就不细说啦~常规操作. 2.背景调色 分析:想塑造油画般的感觉,背景颜色想要蓝绿色 1.用可选颜色工具里面的中性色改变整体颜色,把皮肤和头发颜色用蒙版擦出来: ...
 - P66  整环的零元
			
R/I=0的零因子是0+I吗? 如果不是,那请问R/I的零因子是什么呢? R/I没有零因子 R/I的零元 是I中的元素定义的等价类 么 a是理想I的元素,自然也是R的元素
 - Python_socket常见的方法、网络编程的安全注意事项、socketsever模块、浏览器中在一段时间记录用户的登录验证机制
			
1.socket常见的方法 socket_常见方法_服务器端 import socket from socket import SOL_SOCKET,SO_REUSEADDR sk = socket. ...
 - 爱上linux 简单实现移动办公处理环境.
			
1. 这周一直在鼓捣linux上面的环境测试. 简单的将 我们的产品部署到了linux上面 详情见前面的 blog 2. 有时候下班了 或者是 在WC (科技园wc排队 说多了都是泪) 或者是眼睛不舒 ...
 - JS 将值插入数组中
			
使用 push 方法 1.var arr = [1,2,3] arr.push(数值) 或者 arr.push({xxx:数值}) 2.输出数组中的最后一个 console.log(arr.[arr. ...
 - Redis的java客户端jedis
			
导包:Jedis需要的jar包 >Commons-pool-1.6.jar >Jedis-2.1.0.jar 配置:linux防火墙设置,不会设置就关闭. 停止防火墙 systemctl ...
 - Django--CRM--一级, 二级 菜单表
			
一. 一级菜单表 1. 首先要修改权限表的字段, 在权限表下面加上icon和 is_menu 的字段 2. 展示结果 # 我们既然想要动态生成一级菜单,那么就需要从数据库中拿出当前登录的用户的菜单表是 ...
 - linux ps命令用法
			
-A 列出所有的进程-w 显示加宽可以显示较多的资讯-au 显示较详细的资讯-aux 显示所有包含其他使用者的行程 -A 显示所有进程(等价于-e)(utility)-a 显示 ...