博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 2655: calc
阅读量:5256 次
发布时间:2019-06-14

本文共 1111 字,大约阅读时间需要 3 分钟。

Description

一个序列a1,...,an是合法的,当且仅当:

长度为给定的n。
a1,...,an都是[1,A]中的整数。
a1,...,an互不相等。
一个序列的值定义为它里面所有数的乘积,即a1a2...an。
求所有不同合法序列的值的和。
两个序列不同当且仅当他们任意一位不一样。
输出答案对一个数mod取余的结果。

Solution

由于 \(f(A)\) 是一个关于 \(A\)\(n\) 次多项式 .

知道 \(f[1]...f[2*n+1]\) 然后插值一下就行了.
\(f[1]...f[2*n+1]\) 可以 \(DP\) 求出 , 强制序列递增 , 最后乘以 \(n!\) 就行了.

#include
using namespace std;const int N=1010;int A,n,m,mod,f[N][N],inv[N],Fac[N];int main(){ freopen("pp.in","r",stdin); freopen("pp.out","w",stdout); cin>>A>>n>>mod; m=2*n+1; for(int i=1;i<=m;i++)f[1][i]=i; for(int i=2;i<=n;i++){ int sum=0; for(int j=i-1;j<=m;j++){ f[i][j]=1ll*j*sum%mod; sum=(sum+f[i-1][j])%mod; } } inv[0]=inv[1]=Fac[0]=1; for(int i=2;i<=m;i++)inv[i]=(mod-1ll*(mod/i)*inv[mod%i]%mod)%mod; for(int i=1;i<=m;i++)Fac[i]=1ll*Fac[i-1]*i%mod; for(int i=n;i<=m;i++)f[n][i]=1ll*f[n][i]*Fac[n]%mod; for(int i=n;i<=m;i++)f[n][i]=(f[n][i]+f[n][i-1])%mod; if(A<=m)cout<
=j?inv[i-j]:-inv[j-i])%mod; ans=(ans+1ll*f[n][i]*t)%mod; } cout<<(ans+mod)%mod; return 0;}

转载于:https://www.cnblogs.com/Yuzao/p/9270884.html

你可能感兴趣的文章
poj 1331 Multiply
查看>>
tomcat7的数据库连接池tomcatjdbc的25个优势
查看>>
Html 小插件5 百度搜索代码2
查看>>
P1107 最大整数
查看>>
多进程与多线程的区别
查看>>
Ubuntu(虚拟机)下安装Qt5.5.1
查看>>
java.io.IOException: read failed, socket might closed or timeout, read ret: -1
查看>>
java 常用命令
查看>>
CodeForces Round #545 Div.2
查看>>
卷积中的参数
查看>>
51nod1076 (边双连通)
查看>>
Item 9: Avoid Conversion Operators in Your APIs(Effective C#)
查看>>
深入浅出JavaScript(2)—ECMAScript
查看>>
STEP2——《数据分析:企业的贤内助》重点摘要笔记(六)——数据描述
查看>>
ViewPager的onPageChangeListener里面的一些方法参数:
查看>>
Jenkins关闭、重启,Jenkins服务的启动、停止方法。
查看>>
CF E2 - Array and Segments (Hard version) (线段树)
查看>>
Linux SPI总线和设备驱动架构之四:SPI数据传输的队列化
查看>>
SIGPIPE并产生一个信号处理
查看>>
CentOS
查看>>