2655: calc

题意:长n的序列,每个数\(a_i \in [1,A]\),求所有满足\(a_i\)互不相同的序列的\(\prod_i a_i\)的和


clj的题


一下子想到容斥,一开始从普通容斥的角度考虑,问题在于“规定两个相同,剩下的任意选还可能出现两个相同”


扫了一眼TA的题解,发现他用\(f_i\)表示长i序列的答案。这样的话就很科学了,规定i个相同其他任选时只会多统计i+1个的

\[f(i) = s(1) f(i-1) - \binom{i-1}{1} s(2) f(i-2) + \binom{i-1}{2} s(3) f(i-3) -...\\
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 [容斥原理 伯努利数]的更多相关文章

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

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

  2. BZOJ 2655 calc (组合计数、DP、多项式、拉格朗日插值)

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2655 题解 据说有一种神仙容斥做法,但我不会. 以及貌似网上大多数人的dp和我的做法都不 ...

  3. bzoj 2655 calc——拉格朗日插值

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2655 先考虑DP.dp[ i ][ j ]表示值域为 i .选 j 个值的答案,则 dp[ ...

  4. bzoj 2655 calc —— 拉格朗日插值

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2655 先设 f[i][j] 表示长度为 i 的序列,范围是 1~j 的答案: 则 f[i][ ...

  5. [BZOJ 2655]calc

    Description 题库链接 给出 \(A,n,p\) ,让你在模 \(p\) 意义下求所有序列 \(a\) 满足"长度为 \(n\) 且 \(a_i\in[1,A]\) ,并且对于 \ ...

  6. BZOJ 2655: calc(拉格朗日插值)

    传送门 解题思路 首先比较容易能想到\(dp\),设\(f[i][j]\)表示前\(j\)个数,每个数\(<=i\)的答案,那么有转移方程:\(f[i][j]=f[i-1][j-1]*i*j+f ...

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

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

  8. calc BZOJ 2655

    calc [问题描述] 一个序列a1,...,an是合法的,当且仅当: 长度为给定的n. a1,...,an都是[1,A]中的整数. a1,...,an互不相等. 一个序列的值定义为它里面所有数的乘积 ...

  9. bzoj 3812: 主旋律 [容斥原理 状压DP]

    3812: 主旋律 题意:一张有向图,求它的生成子图是强连通图的个数.\(n \le 15\) 先说一个比较暴力的做法. 终于知道n个点图的是DAG的生成子图个数怎么求了. 暴力枚举哪些点是一个scc ...

随机推荐

  1. hdu_2089(数位dp)

    hdu_2089(数位dp) 标签: dp 我初次接触数位dp表面上看上去挺简单,但是仔细学还是要考虑很多细节的.wa了无数次,这里引入一个 很好地博客 #include<cstdio> ...

  2. [20160711][在Windows下调用neven链接库]

    相关说明 这篇文档是接前篇[20160711][neven代码移植Windows]和[20160711][VS2012配置OpenCV2.4.9]下完成,首先需要通过篇文档编译出neven动态链接库和 ...

  3. JavaScript变量声明与提升

    一直以来对变量提升都是比较模糊的,今天特地看了一下这个知识点,总结一下. 1.举个最简单的例子来说一下什么是变量提升吧. function foo(){ console.log(x); // unde ...

  4. Spark算子--map和flatMap

    map和flatMap--Transformation类算子 代码示例 result  

  5. PHP中put和post区别

    1. 使用支持和范围的区别: PHP提供了对PUT方法的支持,在Http定义的与服务器的交互方法中,PUT是把消息本体中的消息发送到一个URL,形式上跟POST类似; PHP 提供对诸如 Netsca ...

  6. 【JDBC】Java 连接 MySQL 基本过程以及封装数据库工具类

    一. 常用的JDBC API 1. DriverManager类 : 数据库管理类,用于管理一组JDBC驱动程序的基本服务.应用程序和数据库之间可以通过此类建立连接.常用的静态方法如下 static ...

  7. Rootkit 核心技术——利用 nt!_MDL(内存描述符链表)突破 SSDT(系统服务描述符表)的只读访问限制 Part I

    -------------------------------------------------------- 在 rootkit 与恶意软件开发中有一项基本需求,那就是 hook Windows ...

  8. Angular CLI: 发布到 GitHub Pages

    发布 Angular 应用的简单方式是使用 GitHub Pages. 首先需要创建一个 GitHub 账号,随后,为您的项目创建一个仓库.记下 GitHub 中的用户名和项目名称. 例如,我的 Gi ...

  9. ObjectiveC 深浅拷贝学习

    在ObjC中,什么是深浅拷贝? 深浅拷贝分别指深拷贝和浅拷贝,即mutableCopy和copy方法. copy复制一个不可变对象,而mutableCopy复制一个mutable可变对象. 什么时候用 ...

  10. 闲聊cassandra

    原创,转载请注明出处 今天聊聊cassandra,里面用了不少分布式系统设计的经典算法比如consistent hashing, bloom filter, merkle tree, sstable, ...