题目大意

​  一个序列\(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 数学 拉格朗日插值的更多相关文章

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

    传送门 题意简述:问有多少数列满足如下条件: 所有数在[1,A][1,A][1,A]之间. 没有相同的数 数列长度为nnn 一个数列的贡献是所有数之积,问所有满足条件的数列的贡献之和. A≤1e9,n ...

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

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

  3. 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!. 注意到值域很大,考 ...

  4. 51nod1229-序列求和V2【数学,拉格朗日插值】

    正题 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=1229 题目大意 给出\(n,k,r\)求 \[\sum_{i=1}^ni ...

  5. BZOJ2655: calc(dp 拉格朗日插值)

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

  6. 【BZOJ】2655: calc 动态规划+拉格朗日插值

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

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

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

  8. BZOJ.2655.calc(DP/容斥 拉格朗日插值)

    BZOJ 洛谷 待补.刚刚政治会考完来把它补上了2333.考数学去了. DP: 首先把无序化成有序,选严格递增的数,最后乘个\(n!\). 然后容易想到令\(f_{i,j}\)表示到第\(i\)个数, ...

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

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

随机推荐

  1. c++入门之 深入cin

    cin 表示输入流,但是究其本质,又能认识到什么呢?先上代码: #include "iostream" };//c++11中使用{}进行重新命名 int main() { usin ...

  2. Python的socket模块与交互式指令

    socket简介 在编程的过程中,我们需要使用网络编程,这时我们不得不和网络通信的底层基础打交道了.我们必须让自己传输的数据符合网络通信的基本协议,即TCP/IP协议,但是网络通信协议本身很复杂.我们 ...

  3. Effective java ---遵守普遍接受的命名规则

    alibaba的java命名规范如下: . [强制]代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束. 反例: _name / __name / $Object / name_ ...

  4. fun = [lambda x: x*i for i in range(4)] 本质解析/原理,LEGB规则 闭包原理

    命名空间,闭包原理,参考点击本文 一.问题描述 fun = [lambda x: x*i for i in range(4)] for item in fun: print(item(1)) 上述式子 ...

  5. 使用队列queue实现一个简单的生产者消费者模型

    一.生产者消费者模型 我们去超市商店等地购买商品时,我们大部分人都会说自己是消费者,而超市的各大供货商.工厂等,自然而然地也就成了我们的生产者.如此一来,生产者有了,消费者也有了,那么将二者联系起来的 ...

  6. 《梦断代码》Scott Rosenberg著(三)

    开放与封闭之论: 程序源代码是商业软件公司最重要的资产,所以软件公司售卖二进制文件.这样也就意味着如果微软的软件产品出了问题,即便你是一个程序大牛也无法修复它.你只能等着微软来修正问题,因为只有微软程 ...

  7. Python之加环境变量

    1.python找文件是先去当前文件所在的文件夹下找,也就是bin目录下找 2.如果bin目录里找不到,再去python的环境变量里找 如果有pycharm,那么直接点右键-选择Mark Direct ...

  8. sqlserver笔记

    表结构: 一,字段类型sqlserver jdbc java char char Stringnchar nchar Stringvarchar varchar Stringnvarchar nvar ...

  9. nginx 编译安装以及简单配置

    前言 Nginx的大名如雷贯耳,资料太多了,网上一搜一大把,所以这里就不阐述nginx的工作原理了,只是简单的编译安装nginx,然后呢,简单配置一下下. 下载Nginx.安装 下载地址:http:/ ...

  10. 【学习总结】GirlsInAI ML-diary day-1-初识Python-Anaconda-Jupyter

    [学习总结]GirlsInAI ML-diary 总 原博github链接-day1 初识Python-Anaconda-Jupyter: 1-下载并安装Anaconda 官网下载,按指导安装 ana ...