bzoj2655calc 容斥+dp
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的更多相关文章
- 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 ...
- [CF1086E]Beautiful Matrix(容斥+DP+树状数组)
给一个n*n的矩阵,保证:(1)每行都是一个排列 (2)每行每个位置和上一行对应位置不同.求这个矩阵在所有合法矩阵中字典序排第几.考虑类似数位DP的做法,枚举第几行开始不卡限制,那么显然之前的行都和题 ...
- 【BZOJ3622】已经没有什么好害怕的了 容斥+DP
[BZOJ3622]已经没有什么好害怕的了 Description Input Output Sample Input 4 2 5 35 15 45 40 20 10 30 Sample Output ...
- $bzoj2560$ 串珠子 容斥+$dp$
正解:容斥+$dp$ 解题报告: 传送门$QwQ$ $umm$虽然题目蛮简练的了但还是有点难理解,,,我再抽象一点儿,就说有$n$个点,点$i$和点$j$之间有$a_{i,j}$条无向边可以连,问有多 ...
- 【XSY3156】简单计数II 容斥 DP
题目大意 定义一个序列的权值为:把所有相邻的相同的数合并为一个集合后,所有集合的大小的乘积. 特别的,第一个数和最后一个数是相邻的. 现在你有 \(n\) 种数,第 \(i\) 种有 \(c_i\) ...
- bzoj3782上学路线(Lucas+CRT+容斥DP+组合计数)
传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=3782 有部分分的传送门:https://www.luogu.org/problemnew/ ...
- AGC 005D.~K Perm Counting(容斥 DP 二分图)
题目链接 \(Description\) 给定\(n,k\),求 满足对于所有\(i\),\(|a_i-i|\neq k\)的排列的个数. \(2\leq n\leq 2000,\quad 1\leq ...
- ARC 101E.Ribbons on Tree(容斥 DP 树形背包)
题目链接 \(Description\) 给定一棵\(n\)个点的树.将这\(n\)个点两两配对,并对每一对点的最短路径染色.求有多少种配对方案使得所有边都至少被染色一次. \(n\leq5000\) ...
- 【做题】51NOD1518 稳定多米诺覆盖——容斥&dp
题意:求有多少种方案,用多米诺骨牌覆盖一个\(n\times m\)的棋盘,满足任意一对相邻行和列都至少有一个骨牌横跨.对\(10^9+7\)取模. \(n,m \leq 16\) 首先,这个问题的约 ...
随机推荐
- RxSwift 函数响应式编程
Max 在 Boston 上学,在 San Francisco 工作,是一名软件工程师及创业者.当他还在高中的时候就在一家创业公司工作了,他非常喜欢使用 iOS.Android 以及 JavaScri ...
- ASP.NET MVC编程——单元测试
1自动化测试基本概念 自动化测试分为:单元测试,集成测试,验收测试. 单元测试 检验被测单元的功能,被测单元一般为低级别的组件,如一个类或类方法. 单元测试要满足四个条件:自治的,可重复的,独立的,快 ...
- python+flask 分分钟完美解析阿里云日志
拿到了自己阿里云服务器的日志,对其需要进行处理. class Read_Rizhi: def __init__(self,filename): self.filename=filename def o ...
- Spring Cache扩展:注解失效时间+主动刷新缓存(二)
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- 新概念英语(1-101)A Card From Jimmy
Lesson 101 A card from Jimmy 吉米的明信片 Listen to the tape then answer this question. Does Grandmother s ...
- angular2 学习笔记 ( server-side rendering, angular universal, 服务端渲染 )
更新 : 2018-01-10 大半年过去了依然没有做 server side render 的冲动,但是一直有关注这方便的做法. 今天领悟了一些道理, 这里做个记入. server side re ...
- 新概念英语(1-23)Which glasses?
Which glasses does the man want? A:Give me some glasses please, Jane? B:Which glasses? These glasses ...
- 超简单的jQuery前台分页,不需导包
今天我们介绍一个不需要导分页包的,非常容易上手的分页+模糊查询功能.接下来先介绍分页功能: 首先第一步,你要有个要去分页的列表.我这里敲了个简单的图书管理,作为展示的基础,它的列表为异步提交,由两部分 ...
- Python学习之输入输出、数据类型
#coding=utf-8 # 输入 print'100+200=',100+200 # 输入 # name = raw_input('tell me your name:') # print'hel ...
- Array方面Js底层代码学习记录
一..clear() →Array function clear() { this.length = 0; return this; } 返回清除item的空数组. 例子: var fruits = ...