2655: calc

Time Limit: 30 Sec  Memory Limit: 512 MB
Submit: 322  Solved: 197
[Submit][Status][Discuss]

Description

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

Input

  一行3个数,A,n,mod。意义为上面所说的。

Output

  一行结果。

Sample Input

9 7 10007

Sample Output

3611

HINT

数据规模和约定
  0:A<=10,n<=10。
  1..3:A<=1000,n<=20.
  4..9:A<=10^9,n<=20
  10..19:A<=10^9,n<=500。
  全部:mod<=10^9,并且mod为素数,mod>A>n+1

算法1

容斥法:
推荐blog
http://blog.csdn.net/qq_20669971/article/details/52790835

有一点不是很懂,就是那个统计f数组时阶乘那里

又想了一下,大概是每次填数,我们是从前向后填的,
而实际上,是可以任意顺序填的,虽然f[i-j]贡献的答案是一样的,
但i-j个格子不同,填数的方案不同,应该多算几次

例如下面这张图片,现在该填12的位置,考虑重复4个位置,C(11,3)*f[8]选出了3 6 8三个位置贡献答案

实际上是可以先填上3 或6 或8再填两边,虽然都是f[8]贡献答案但是填数方案不同

先填3 那么得到的答案就是由[1,2][4,11]转移的

先填6 那么得到的答案就是由[1,5][7,11]转移的

先填8 那么得到的答案就是由[1,7][9,11]转移的

而每一层都需要这样考虑,所以 *3!

算法2

暴力法。

f[i][j]表示前i个格子,第i个格子填<=j的数的方案数
f[i][j]=f[i-1][j-1]*j+f[i][j-1]   复杂度O(nA)

第二维枚举A是肯定要TLE的,考虑优化
可以观察出这个东西可以表示成一个最高次为2n的多项式,未知数为j
那么就可以用拉格朗日求啦

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define ll long long
#define N 605
using namespace std;
ll inv[N],c[N][N],fac[N],g[N],f[N],A,n,mod;
int main(){
cin>>A>>n>>mod;
fac[0]=1;inv[1]=1;
for(int i=1;i<=510;i++)
fac[i]=(fac[i-1]*i)%mod;
for(int i=2;i<=510;i++)
inv[i]=(1ll*(mod-mod/i)*inv[mod%i])%mod;
for(int i=0;i<=n;i++)c[i][i]=c[i][0]=1;
for(int i=1;i<=510;i++)
for(int j=1;j<i;j++)
c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
g[0]=(A+1)%mod;g[1]=(1ll*A*(A+1)>>1)%mod;
ll t=(A+1)*(A+1)%mod;
for(int i=2;i<=n;i++){
t=((A+1)*t)%mod;
ll sum=(A+1)%mod;
for(int j=1;j<i;j++)
sum=(sum+1ll*c[i+1][j]*g[j]%mod)%mod;
sum=(t-sum)%mod;
sum<0?sum+=mod:1;
g[i]=(sum*inv[i+1])%mod;
}
f[0]=1;f[1]=(1ll*(A+1)*A>>1)%mod;
for(int i=2;i<=n;i++){
f[i]=g[1]*f[i-1]%mod;
ll fg=-1;
for(int j=i-2;~j;j--){
f[i]=(f[i]+1ll*fg*fac[i-1-j]%mod*c[i-1][i-1-j]%mod*g[i-j]%mod*f[j]%mod+mod)%mod;
fg=-fg;
}
}
cout<<f[n];
return 0;
}

bzoj2655calc 容斥+dp的更多相关文章

  1. HDU 5794 A Simple Chess (容斥+DP+Lucas)

    A Simple Chess 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5794 Description There is a n×m board ...

  2. [CF1086E]Beautiful Matrix(容斥+DP+树状数组)

    给一个n*n的矩阵,保证:(1)每行都是一个排列 (2)每行每个位置和上一行对应位置不同.求这个矩阵在所有合法矩阵中字典序排第几.考虑类似数位DP的做法,枚举第几行开始不卡限制,那么显然之前的行都和题 ...

  3. 【BZOJ3622】已经没有什么好害怕的了 容斥+DP

    [BZOJ3622]已经没有什么好害怕的了 Description Input Output Sample Input 4 2 5 35 15 45 40 20 10 30 Sample Output ...

  4. $bzoj2560$ 串珠子 容斥+$dp$

    正解:容斥+$dp$ 解题报告: 传送门$QwQ$ $umm$虽然题目蛮简练的了但还是有点难理解,,,我再抽象一点儿,就说有$n$个点,点$i$和点$j$之间有$a_{i,j}$条无向边可以连,问有多 ...

  5. 【XSY3156】简单计数II 容斥 DP

    题目大意 定义一个序列的权值为:把所有相邻的相同的数合并为一个集合后,所有集合的大小的乘积. 特别的,第一个数和最后一个数是相邻的. 现在你有 \(n\) 种数,第 \(i\) 种有 \(c_i\) ...

  6. bzoj3782上学路线(Lucas+CRT+容斥DP+组合计数)

    传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=3782 有部分分的传送门:https://www.luogu.org/problemnew/ ...

  7. AGC 005D.~K Perm Counting(容斥 DP 二分图)

    题目链接 \(Description\) 给定\(n,k\),求 满足对于所有\(i\),\(|a_i-i|\neq k\)的排列的个数. \(2\leq n\leq 2000,\quad 1\leq ...

  8. ARC 101E.Ribbons on Tree(容斥 DP 树形背包)

    题目链接 \(Description\) 给定一棵\(n\)个点的树.将这\(n\)个点两两配对,并对每一对点的最短路径染色.求有多少种配对方案使得所有边都至少被染色一次. \(n\leq5000\) ...

  9. 【做题】51NOD1518 稳定多米诺覆盖——容斥&dp

    题意:求有多少种方案,用多米诺骨牌覆盖一个\(n\times m\)的棋盘,满足任意一对相邻行和列都至少有一个骨牌横跨.对\(10^9+7\)取模. \(n,m \leq 16\) 首先,这个问题的约 ...

随机推荐

  1. git基本语法

    基本用法(上)               一.实验说明 本节实验为 Git 入门第一个实验,可以帮助大家熟悉如何创建和使用 git 仓库. 二.git的初始化 在使用git进行代码管理之前,我们首先 ...

  2. 【iOS】swift 保持代码优美的10个方法

    这篇Swift风格指南与你看到的其他的指南有所不同,此篇指南主要焦点集中在打印和Web展示的可读写上.我们创建此篇风格指南的目的,是为了让我们的图书.教程以及初学者套件中的代码保持优美和一致,即使我们 ...

  3. css3动画 一行字鼠标触发 hover 从左到右颜色渐变

    偶然的机会发现的这个东东 这几天做公司的官网 老板突然说出了一个外国网站 我就顺手搜了 并没有发现他说的高科技 但是一个东西深深地吸引了我 就是我下面要说的动画  这个好像不能放视频 我就简单的描述一 ...

  4. 20170222==(MODBUS读取多个寄存器)

    MODBUS读取多个寄存器(功能码04) 为了简单我这里只用4个寄存器,当让你也可以用125个寄存器,但是最多也只能用125个寄存器的.每个寄存器有上面的表知道为一个字的大小即2个字节或者叫16比特位 ...

  5. GIT入门笔记(3)- git中的一些概念和原理

    一.git管理过程中所处的4个阶段: 工作目录(workspace) 暂存区(index) 本地仓库(local repository) 远程仓库(remote repository) 二.工作目录+ ...

  6. spring5——Aop的实现原理(动态代理)

    spring框架的核心之一AOP,面向切面编程是一种编程思想.我对于面向切面编程的理解是:可以让我们动态的控制程序的执行流程及执行结果.spring框架对AOP的实现是为了使业务逻辑之间实现分离,分离 ...

  7. python的单元测试

    单元测试实际上就是一些"断言"(assert)代码 断言就是判断一个函数或对象的一个方法所产生的结果是否符合你期望的那个结果. python中assert断言是声明布尔值为真的判定 ...

  8. Python面向对象进阶示例--自定义数据类型

    需求: 基于授权定制自己的列表类型,要求定制的自己的__init__方法, 定制自己的append:只能向列表加入字符串类型的值 定制显示列表中间那个值的属性(提示:property) 其余方法都使用 ...

  9. POJ-1287 Networking---裸的不能再裸的MST

    题目链接: https://vjudge.net/problem/POJ-1287 题目大意: 模板 #include<iostream> #include<cstdio> # ...

  10. jquery mouseout mouseover 多次执行

    用jquery,mouseout,mouseover,随着鼠标移动,事件被触发了多次(冒泡),换成js onmouseover,onmouseout也是一样.最终的解决办法是,用jquery,mous ...