bzoj 2655: calc [容斥原理 伯努利数]
2655: calc
题意:长n的序列,每个数\(a_i \in [1,A]\),求所有满足\(a_i\)互不相同的序列的\(\prod_i a_i\)的和
clj的题
一下子想到容斥,一开始从普通容斥的角度考虑,问题在于“规定两个相同,剩下的任意选还可能出现两个相同”
扫了一眼TA的题解,发现他用\(f_i\)表示长i序列的答案。这样的话就很科学了,规定i个相同其他任选时只会多统计i+1个的
s(m) = \sum_{i=1}^A i^m
\]
但这样写是不对的!
昨天晚上还不是很理解,今天早上来想明白了!
统计两个相同时,每个三个相同其实多统计了\(\binom{2}{1}\)次!
对于i个相同,多统计的次数为\(\prod_{j=2}^{i-1} \binom{j}{j-1} = (i-1)!\)
所以最后的式子还要乘上个阶乘
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 505;
inline int read(){
char c=getchar(); int x=0,f=1;
while(c<'0'||c>'9') {if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();}
return x*f;
}
int A, n, mo, inv2;
inline ll Pow(ll a, int b) {
ll ans = 1;
for(; b; b >>= 1, a = a * a %mo)
if(b & 1) ans = ans * a %mo;
return ans;
}
ll inv[N], fac[N], facInv[N], b[N], sum, s[N], ans, f[N];
inline ll C(int n, int m) {return fac[n] * facInv[m] %mo * facInv[n-m] %mo;}
void init() {
inv[1] = fac[0] = facInv[0] = 1;
for(int i=1; i<=n+1; i++) {
if(i != 1) inv[i] = (mo - mo/i) * inv[mo%i] %mo;
fac[i] = fac[i-1] * i %mo;
facInv[i] = facInv[i-1] * inv[i] %mo;
}
b[0] = 1; b[1] = mo - inv2;
for(int m=2; m<=n; m++) if(~m&1) {
for(int k=0; k<m; k++) b[m] = (b[m] - C(m+1, k) * b[k]) %mo;
b[m] = b[m] * Pow(m+1, mo-2) %mo;
if(b[m] < 0) b[m] += mo;
}
b[1] = inv2;
static ll mi[N];
mi[0] = 1;
for(int i=1; i<=n+1; i++) mi[i] = mi[i-1] * A %mo;
for(int m=1; m<=n; m++) {
ll t = 0;
for(int k=0; k<=m; k++) t = (t + C(m+1, k) * b[k] %mo * mi[m+1-k] %mo) %mo;
s[m] = t * inv[m+1] %mo;
}
}
int main() {
freopen("in", "r", stdin);
A=read(); n=read(); mo=read(); inv2 = (mo+1)/2;
init();
f[0] = 1;
for(int i=1; i<=n; i++) {
ll t = s[1] * f[i-1] %mo;
for(int j=2; j<=i; j++) t = (t + ((j&1) ? 1 : -1) * C(i-1, j-1) * fac[j-1] %mo * s[j] %mo * f[i-j] %mo ) %mo;
f[i] = t;
}
printf("%lld\n", (f[n] + mo) %mo);
}
bzoj 2655: calc [容斥原理 伯努利数]的更多相关文章
- BZOJ.2655.calc(DP/容斥 拉格朗日插值)
BZOJ 洛谷 待补.刚刚政治会考完来把它补上了2333.考数学去了. DP: 首先把无序化成有序,选严格递增的数,最后乘个\(n!\). 然后容易想到令\(f_{i,j}\)表示到第\(i\)个数, ...
- BZOJ 2655 calc (组合计数、DP、多项式、拉格朗日插值)
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2655 题解 据说有一种神仙容斥做法,但我不会. 以及貌似网上大多数人的dp和我的做法都不 ...
- bzoj 2655 calc——拉格朗日插值
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2655 先考虑DP.dp[ i ][ j ]表示值域为 i .选 j 个值的答案,则 dp[ ...
- bzoj 2655 calc —— 拉格朗日插值
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2655 先设 f[i][j] 表示长度为 i 的序列,范围是 1~j 的答案: 则 f[i][ ...
- [BZOJ 2655]calc
Description 题库链接 给出 \(A,n,p\) ,让你在模 \(p\) 意义下求所有序列 \(a\) 满足"长度为 \(n\) 且 \(a_i\in[1,A]\) ,并且对于 \ ...
- BZOJ 2655: calc(拉格朗日插值)
传送门 解题思路 首先比较容易能想到\(dp\),设\(f[i][j]\)表示前\(j\)个数,每个数\(<=i\)的答案,那么有转移方程:\(f[i][j]=f[i-1][j-1]*i*j+f ...
- 【BZOJ】2655: calc 动态规划+拉格朗日插值
[题意]一个序列$a_1,...,a_n$合法当且仅当它们都是[1,A]中的数字且互不相同,一个序列的价值定义为数字的乘积,求所有序列的价值和.n<=500,A<=10^9,n+1< ...
- calc BZOJ 2655
calc [问题描述] 一个序列a1,...,an是合法的,当且仅当: 长度为给定的n. a1,...,an都是[1,A]中的整数. a1,...,an互不相等. 一个序列的值定义为它里面所有数的乘积 ...
- bzoj 3812: 主旋律 [容斥原理 状压DP]
3812: 主旋律 题意:一张有向图,求它的生成子图是强连通图的个数.\(n \le 15\) 先说一个比较暴力的做法. 终于知道n个点图的是DAG的生成子图个数怎么求了. 暴力枚举哪些点是一个scc ...
随机推荐
- hdu_2089(数位dp)
hdu_2089(数位dp) 标签: dp 我初次接触数位dp表面上看上去挺简单,但是仔细学还是要考虑很多细节的.wa了无数次,这里引入一个 很好地博客 #include<cstdio> ...
- [20160711][在Windows下调用neven链接库]
相关说明 这篇文档是接前篇[20160711][neven代码移植Windows]和[20160711][VS2012配置OpenCV2.4.9]下完成,首先需要通过篇文档编译出neven动态链接库和 ...
- JavaScript变量声明与提升
一直以来对变量提升都是比较模糊的,今天特地看了一下这个知识点,总结一下. 1.举个最简单的例子来说一下什么是变量提升吧. function foo(){ console.log(x); // unde ...
- Spark算子--map和flatMap
map和flatMap--Transformation类算子 代码示例 result
- PHP中put和post区别
1. 使用支持和范围的区别: PHP提供了对PUT方法的支持,在Http定义的与服务器的交互方法中,PUT是把消息本体中的消息发送到一个URL,形式上跟POST类似; PHP 提供对诸如 Netsca ...
- 【JDBC】Java 连接 MySQL 基本过程以及封装数据库工具类
一. 常用的JDBC API 1. DriverManager类 : 数据库管理类,用于管理一组JDBC驱动程序的基本服务.应用程序和数据库之间可以通过此类建立连接.常用的静态方法如下 static ...
- Rootkit 核心技术——利用 nt!_MDL(内存描述符链表)突破 SSDT(系统服务描述符表)的只读访问限制 Part I
-------------------------------------------------------- 在 rootkit 与恶意软件开发中有一项基本需求,那就是 hook Windows ...
- Angular CLI: 发布到 GitHub Pages
发布 Angular 应用的简单方式是使用 GitHub Pages. 首先需要创建一个 GitHub 账号,随后,为您的项目创建一个仓库.记下 GitHub 中的用户名和项目名称. 例如,我的 Gi ...
- ObjectiveC 深浅拷贝学习
在ObjC中,什么是深浅拷贝? 深浅拷贝分别指深拷贝和浅拷贝,即mutableCopy和copy方法. copy复制一个不可变对象,而mutableCopy复制一个mutable可变对象. 什么时候用 ...
- 闲聊cassandra
原创,转载请注明出处 今天聊聊cassandra,里面用了不少分布式系统设计的经典算法比如consistent hashing, bloom filter, merkle tree, sstable, ...