题目链接

https://www.lydsy.com/JudgeOnline/problem.php?id=2655

题解

据说有一种神仙容斥做法,但我不会。
以及貌似网上大多数人的dp和我的做法都不一样。

下面讲我的做法:
首先由于元素互不相同,那么显然可以先不考虑顺序。
所以要求的就是\(n![x^n]\prod^{m}_{i=1}(1+ix)\) (直接莽上生成函数是不是有点……)
于是发现这个东西和第一类斯特林数生成函数几乎一样,也可以轻易写出递推式\(dp[i][j]=dp[i-1][j]+dp[i-1][j-1]\times i\)

有一个结论是,\(dp[i][j]\)是关于\(i\)的不超过\(2j\)次多项式。
感性理解的话,就是从\(1\)到\(i\)里选\(j\)个,求乘积之和,\(1\)到\(i\)里选\(j\)个一共有\(i\choose j\)种选法,这显然是\(j\)次多项式,再求\(j\)个不超过\(i\)的数的乘积显然也是\(j\)次,那么总共就是\(2j\)次。
于是求出前\(2n\)项,Lagrange插值计算即可。
(所以这其实是一种求第一类斯特林数\(\begin{bmatrix}n\\m\end{bmatrix}\) (\(n-m\)较小)的新方法?)

时间复杂度\(O(n^2)\).

代码

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cassert>
#include<iostream>
#define llong long long
using namespace std;const int N = 1000;
llong fact[N+3],finv[N+3];
llong dp[N+3][N+3];
llong n,m,P;llong quickpow(llong x,llong y)
{llong cur = x,ret = 1ll;for(int i=0; y; i++){if(y&(1ll<<i)) {y-=(1ll<<i); ret = ret*cur%P;}cur = cur*cur%P;}return ret;
}
llong mulinv(llong x) {return quickpow(x,P-2);}namespace Lagrange
{llong ax[N+3],ay[N+3],poly[N+3];llong aux[N+3],aux2[N+3];void lagrange(int n){aux[0] = 1ll;for(int i=0; i<=n; i++){for(int j=i+1; j>0; j--){aux[j] = (aux[j-1]-aux[j]*ax[i]%P+P)%P;}aux[0] = P-aux[0]*ax[i]%P;}for(int i=0; i<=n; i++){llong coe = 1ll;for(int j=0; j<=n; j++){if(i==j) continue;coe = coe*(ax[i]-ax[j]+P)%P;}coe = mulinv(coe);for(int j=0; j<=n+1; j++) aux2[j] = aux[j];for(int j=n; j>=0; j--){poly[j] = (poly[j]+ay[i]*aux2[j+1]%P*coe)%P;aux2[j] = (aux2[j]+aux2[j+1]*ax[i])%P;}}}llong calc(int n,llong x){llong ret = 0ll;for(int i=n; i>=0; i--){ret = (ret*x+poly[i])%P;}return ret;}void clear(int n){for(int i=0; i<=n+1; i++) aux[i] = aux2[i] = poly[i] = 0ll;}
}int main()
{scanf("%lld%lld%lld",&m,&n,&P);fact[0] = 1ll; for(int i=1; i<=N; i++) fact[i] = fact[i-1]*i%P;finv[N] = quickpow(fact[N],P-2); for(int i=N-1; i>=0; i--) finv[i] = finv[i+1]*(i+1)%P;dp[0][0] = 1ll;for(int i=1; i<=n+n; i++){dp[i][0] = 1ll;for(int j=1; j<=i; j++){dp[i][j] = (dp[i-1][j]+dp[i-1][j-1]*i)%P;}}for(int i=0; i<=n+n; i++){Lagrange::ax[i] = i;Lagrange::ay[i] = dp[i][n];}Lagrange::lagrange(n+n);llong ans = Lagrange::calc(n+n,m)*fact[n]%P;printf("%lld\n",ans);return 0;
}

BZOJ 2655 calc (组合计数、DP、多项式、拉格朗日插值)相关推荐

  1. 洛谷P4463:calc(dp、拉格朗日插值)

    Solution\text{Solution}Solution 神奇题目. 首先可以强制所有的数递增,最后的答案乘一个 n!n!n! 即可. 设 dpi,jdp_{i,j}dpi,j​ 表示在 [1, ...

  2. bzoj 2655: calc [容斥原理 伯努利数]

    2655: calc 题意:长n的序列,每个数\(a_i \in [1,A]\),求所有满足\(a_i\)互不相同的序列的\(\prod_i a_i\)的和 clj的题 一下子想到容斥,一开始从普通容 ...

  3. [CF995F] Cowmpany Cowmpensation(树形dp,拉格朗日插值)

    树形DP: 设f[u][i]f[u][i]f[u][i]表示给uuu的子树分配工资,uuu点工资为iii的方案数 f[u][i]=∏v∈sonu(∑j=1if[v][j])f[u][i]=\prod\ ...

  4. BZOJ 3456 城市规划 (组合计数、DP、FFT)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3456 著名的多项式练习题,做法也很多,终于切掉了纪念 首先求一波递推式: 令\(F(n ...

  5. Educational Codeforces Round 81 (Rated for Div. 2) F.Good Contest \ 洛谷 划艇 组合 计数dp

    cf传送门 P3643 [APIO2016]划艇 文章目录 题意: 思路: 题意: aia_iai​在[li,ri][l_i,r_i][li​,ri​]等概率随机选一个数,求aaa数组不增的概率. 思 ...

  6. bzoj2111,P2606-[ZJOI2010]排列计数【Lucas,组合计数,dp】

    正题 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2111 https://www.luogu.org/problem/P2606 题 ...

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

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

  8. 【12月学习进度3/31—计算机图形学期末准备01】拉格朗日插值 + 三次Hermite插值

    相关概念 型值点:事先给定的离散点 插值:得到的曲线通过所有的型值点 逼近:不要求通过给定的所有型值点,用给定型值点控制曲线形状 Hermite多项式 拉格朗日插值 拉格朗日插值是当 j=0j=0j= ...

  9. bzoj 4559 [JLoi2016]成绩比较 —— DP+拉格朗日插值

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4559 看了看拉格朗日插值:http://www.cnblogs.com/ECJTUACM-8 ...

最新文章

  1. SSHFD:IBM提出的单阶段人体跌倒检测网络
  2. 制作碳排放强度的空间可视化_【科研成果】吴传清、宋子逸:长江经济带农业碳排放的时空差异特征分析...
  3. iOS: Crash文件解析
  4. c++ primer 习题13.39自己做的答案
  5. 如何解决机器学习中的数据不平衡问题?
  6. ASP.NET Core中间件(Middleware)实现WCF SOAP服务端解析
  7. 【UML】UML扩展的建模概念
  8. sublime text下 Python 问题:TabError: inconsistent use of tabs and spaces in indentation
  9. mysql openwrt 编译_如何编译OpenWrt
  10. 逐帧动画 and 有限状态机(fsm)
  11. MentoHUST讲解教程(锐捷破解)
  12. RS485/RS232通信协议
  13. hdoj 1054 Strategic Game 最小点覆盖模版题dfs方式(Java版)
  14. 腾讯技术分享实录:游戏后台开发九问
  15. vue项目打包 发现首页打不开或空白页面
  16. 超声波测距仪编程_超声波测距详细资料及程序代码
  17. 地理信息系统(GIS) 知识详解
  18. Git 找回删除的分支
  19. C语言程序设计入门08——初识格式化输出1:格式化输出PI值
  20. 懒惰、急躁和傲慢(Laziness, Impatience and hubris)

热门文章

  1. 十五、“一路风光无限好,鸣嘤处处贺新婚。”(2021.5.3)
  2. 嵌入式linux开发课程设计,嵌入式Linux开发课程设计指导书
  3. c++ 读文件_Linux文件(文件夹)详解
  4. 3DSlicer31:结构的实例分析IGSReader
  5. linux中GDB详细使用手册
  6. 【CyberSecurityLearning 22】传输层协议分析(TCP/UDP)
  7. 零起点学算法82——数组中查找数
  8. Keil Debug(printf) Viewer的使用
  9. 使用u-boot的USB下载功能烧写程序到Nand Flash ——韦东山嵌入式Linux学习笔记06
  10. Java Instant类