题面十分简单,n个球放m个盒子,可以空,盒子不同,要求球数最多的盒子唯一,方案数题面十分简单,n个球放m个盒子,可以空,盒子不同,要求球数最多的盒子唯一,方案数
n,m都是500,考虑复杂度O(n3)n,m都是500,考虑复杂度O(n^3)
首先O(n)的枚举最多的球数,假设第一个盒子最多首先O(n)的枚举最多的球数,假设第一个盒子最多
然后考虑后面m−1个盒子,放n−x个球,每个盒子小于x个然后考虑后面m-1个盒子,放n-x个球,每个盒子小于x个
所以可以考虑dp状态,dp[i][j]表示前i个盒子,放了j格球且每个盒子小于x的方案所以可以考虑dp状态,dp[i][j]表示前i个盒子,放了j格球且每个盒子 小于x的方案
dp[i][j]=dp[i−1][j]+dp[i−1][j−1]+⋯+dp[i−1][j−x+1]dp[i][j]=dp[i-1][j]+dp[i-1][j-1]+\dots+dp[i-1][j-x+1]
这是O(nm)的状态,O(n)的转移,可能会T这是O(nm)的状态,O(n)的转移,可能会T
但是仔细观察这个转移,其实可以前缀和优化但是仔细观察这个转移,其实可以前缀和优化
dp[i][j]=dp[i][j−1]−dp[i−1][j−x]+dp[i−1][j],就能实现O(1)的转移dp[i][j]=dp[i][j-1]-dp[i-1][j-x]+dp[i-1][j],就能实现O(1)的转移
总复杂度O(n3)总复杂度O(n^3)
不贴代码了不贴代码了

蓝儿这题还有一种O(n2)的容斥方法蓝儿这题还有一种O(n^2)的容斥方法
先O(n)的枚举第一个盒子最多x个先O(n)的枚举第一个盒子最多x个
然后ans=∑F(n−x,m−1,x)然后ans=\sum F(n-x,m-1,x)
F(n,m,x)=∑mi=0(−1)iC(m,i)f(n−ix,m)F(n,m,x)=\sum_{i=0}^m (-1)^iC(m,i)f(n-ix,m)
f表示n个球放进m个盒子的所有情况f表示n个球放进m个盒子的所有情况
为什么这么容斥呢,因为有x1+x2+⋯+xm=n,并且xi≤s为什么这么容斥呢,因为有x_1+x_2+\dots+x_m=n,并且 x_i\le s
所以容斥就是考虑没有限制条件,有一个限制条件,有两个。。。所以容斥就是考虑没有限制条件,有一个限制条件,有两个。。。
这样搞一下就行了这样搞一下就行了
其实这也是我会的东西,但是比赛时候没有考虑到啊GG好弱其实这也是我会的东西,但是比赛时候没有考虑到啊GG好弱


代码:

#include <map>
#include <set>
#include <stack>
#include <queue>
#include <cmath>
#include <string>
#include <vector>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <sstream>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#pragma comment(linker,"/STACK:102400000,102400000")using namespace std;
#define   MAX           200005
#define   MAXN          1000005
#define   maxnode       133
#define   sigma_size    30
#define   lson          l,m,rt<<1
#define   rson          m+1,r,rt<<1|1
#define   lrt           rt<<1
#define   rrt           rt<<1|1
#define   middle        int m=(r+l)>>1
#define   LL            long long
#define   ull           unsigned long long
#define   mem(x,v)      memset(x,v,sizeof(x))
#define   lowbit(x)     (x&-x)
#define   pii           pair<int,int>
#define   bits(a)       __builtin_popcount(a)
#define   mk            make_pair
#define   limit         10000//const int    prime = 999983;
const int    INF   = 0x3f3f3f3f;
const LL     INFF  = 0x3f3f;
const double pi    = acos(-1.0);
const double inf   = 1e18;
const double eps   = 1e-8;
const LL     mod   = 998244353;
const ull    mx    = 133333331;/*****************************************************/
inline void RI(int &x) {char c;while((c=getchar())<'0' || c>'9');x=c-'0';while((c=getchar())>='0' && c<='9') x=(x<<3)+(x<<1)+c-'0';}
/*****************************************************/LL  fact[1005];LL qpow(LL a,LL n){LL ans=1;while(n){if(n&1) ans=ans*a%mod;a=a*a%mod;n>>=1;}return ans;
}
LL  C(int n,int m){return (fact[n]*qpow(fact[n-m],mod-2)%mod)*qpow(fact[m],mod-2)%mod;
}
LL f(int n,int m){return C(n+m-1,m-1);
}
LL F(int n,int m,int x){LL ans=0;for(int i=0;i<=m;i++){if(n-i*x<0) break;if(i%2) ans-=C(m,i)*f(n-i*x,m)%mod;else ans+=C(m,i)*f(n-i*x,m)%mod;}return (ans%mod+mod)%mod;
}
int main(){int n,m;cin>>n>>m;if(m==1){cout<<1<<endl;return 0;}LL ans=0;fact[0]=1;for(int i=1;i<=1000;i++) fact[i]=fact[i-1]*i%mod;for(int i=n/m;i<=n;i++){ans=(ans+F(n-i,m-1,i))%mod;}cout<<ans*m%mod<<endl;return 0;
}

玲珑oj 1032 (容斥原理或前缀和优化dp)相关推荐

  1. bzoj 3398 [Usaco2009 Feb]Bullcow 牡牛和牝牛——前缀和优化dp / 排列组合

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3398 好简单呀.而且是自己想出来的. dp[ i ]表示最后一个牡牛在 i 的方案数. 当前 ...

  2. #798. 徐老师的二维动规(二维前缀和优化+dp)

    考虑进行 DP,记 dp[i][j] 为 (1, 1) 到 (i, j) 的方案数,此时暴力求dp的复杂度为 O(WHK^2) ,可以通过 70分的数据.注意到转移的本质其实就是子矩阵求和,用二维前缀 ...

  3. Atcoder dp_m Candies 前缀和优化dp

    文章目录 题意 题解 题意 给nnn个孩子发kkk颗糖,每个孩子最多拿到aia_iai​颗,问有多少种分法. n≤100,k≤105n\leq 100,k\leq 10^5n≤100,k≤105. 题 ...

  4. 2021牛客第一场 I. Increasing Subsequence-前缀和优化dp

    https://ac.nowcoder.com/acm/contest/11166/I 思路:dp[i][j] 是表示上上步走在i点,上一步走在j点的期望.首先我们很容易想到n^3的做法,那我们必须考 ...

  5. 玲珑oj 1032A-B(组合数学)

    1032 - A-B Time Limit:1s Memory Limit:128MByte Submissions:528Solved:105 DESCRIPTION 你有n个球,需要把他们放到m个 ...

  6. 第十一届山东省大学生程序设计竞赛 L. Construction of 5G Base Stations(概率期望,递推前缀和优化)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 第十一届山东省大学生程序设计竞赛 L. Construction of 5G Base Station ...

  7. codeforces #274 C. Riding in a Lift dp+前缀和优化

    codeforces #274  C. Riding in a Lift   dp+前缀和优化 Imagine that you are in a building that has exactly  ...

  8. 前缀和优化+计蒜客 泡咖啡

    题目: 蒜头君想泡咖啡喝.现在他得到了 nn 份菜谱,每个菜谱上都给了两个数l,rl,rl,r代表温度区间在[l,r][l,r][l,r] 度泡出来的咖啡会很好喝. 可是菜谱太多了,蒜头君一度感到疑惑 ...

  9. 序列计数(动态规划/自动机/前缀和优化)

    序列计数 对于一个小写字母的序列每次可以将相邻两个不同的小写字母都变为二者之一,可以进行无限次这样的操作,求解可以产生多少种不同的序列. 首先我们不能考虑操作,而是考虑合法序列,显然最后会形成若干个区 ...

最新文章

  1. quicklook不能预览office_万物皆可格!给空格键施加神奇魔法的神器软件—快速预览工具QuicklookPC软件...
  2. Winforn中设置ZedGraph多条Y轴时曲线刻度不均匀问题解决
  3. 轻松学MVC4.0–2 创建用户列表页面
  4. InnoDB支持的最大事务数量
  5. ruby,rails环境架设配置 转载一文章.
  6. java项目中的classpath
  7. 成员指针运算符 .* 和 -*
  8. css 样式面板,关于 CSS 样式面板
  9. MyEclipse代码提示快捷键和常用设置
  10. .NET的托管堆中是否可能出现内存泄漏现象
  11. 牛皮啊!竟然可以为Dubbo接口生成文档了!
  12. 美国工程管理计算机方向,理工科同学必看!美国工程管理研究生申请大揭秘~...
  13. c++实现课程管理系统
  14. 【程序源代码】投票小程序
  15. Centos 安装阿里软件安装源
  16. Flutter从相册选择图片并显示出来,上传到服务器
  17. 回溯(backtrack)描述
  18. SoFiA2用户手册自翻译
  19. Python中安装GDAL
  20. 京东方和TCL为争夺全球液晶面板老大位置,展开并购竞赛

热门文章

  1. Coarse-Grain Fine-Grain Coattention Network for Multi-Evidence Question Answering
  2. 暨南大学导师推荐、导师口碑、导师黑名单
  3. 软件测试 -- 进阶 11 手工测试与自动化测试
  4. [小技巧]怎么把电脑PC微信通知声调小?单独调整电脑微信音量
  5. [pytorch学习笔记] 3.Datasets Dataloaders
  6. fiilt1左耳无法同步_【FIIL T1 蓝牙耳机使用总结】功能|操作|闪连|防水|音质_摘要频道_什么值得买...
  7. 80后小学生必杀经典句子
  8. idea配置Tomcat时没有Artifacts选项
  9. 版本管理之gitlab实践教程:基础篇(3)
  10. 零输入响应,零状态响应和完全响应