2019-3-15 模拟赛 T1
题意
给你一个数 \(k\) ,\(n\) 个桶,有 \(m\) 个桶有容量上限 \(w_i\) ,其它桶则没有。求把数拆开放到各个桶里,最终得到序列的方案数。
数据范围 : \(n,k<=5*10^6\) , \(m,w_i<=300\) 。
做法
考虑到 \(m\) , \(w[i]\)很小,我们先假装不存在有限制的桶。
等等!这样不就是插板法裸题了吗?答案显然是\(C^{n-1}_{k+n-1}\)的呀。
我们再来考虑有限制的情况,因为数据很小,我们考虑把 \(k\) 分为两份,一份直接暴力dp算出方案数,一份用刚刚的公式计算。枚举分割点(它不会超过 \(90000\) 个),直接相加即可。
最后还要注意用前缀和优化dp转移,组合数预处理等。
做完了,复杂度 \(O(n+m^2*w_{max})\) 。
代码实现
#include<cstdio>
const long long mod=1e9+7;
long long pu[10000005],inv[10000005];
long long w[305],dp[305][90005],sum[305][90005];
long long qpow(long long val,long long k){long long ret=1;while(k){if(k&1) ret=ret*val%mod;val=val*val%mod; k>>=1;}return ret;
}
long long C(long long n,long long m){return (pu[n]*inv[m]%mod)*inv[n-m]%mod;
}
void init(int maxn){pu[0]=1;//!!!!for(int i=1;i<=maxn;i++) pu[i]=pu[i-1]*i%mod;inv[maxn]=qpow(pu[maxn],mod-2);for(int i=maxn-1;i>=0;i--) inv[i]=inv[i+1]*(i+1ll)%mod;dp[0][0]=1;return ;
}
int main(){int n,m,k;scanf("%d%d%d",&n,&m,&k);init(n+k);for(int i=1;i<=m;i++) scanf("%lld",&w[i]);int sumw=0;for(int i=1;i<=m;i++){sum[i-1][0]=dp[i-1][0];for(int j=1;j<=sumw;j++)sum[i-1][j]=(sum[i-1][j-1]+dp[i-1][j])%mod;for(int j=sumw+1;j<=sumw+w[i];j++)sum[i-1][j]=sum[i-1][j-1];sumw+=w[i];dp[i][0]=1;for(int j=1;j<=sumw;j++){if(j<=w[i]) dp[i][j]=(dp[i-1][j]+sum[i-1][j-1])%mod;else dp[i][j]=(dp[i-1][j]+(sum[i-1][j-1]-sum[i-1][j-w[i]-1]+mod)%mod)%mod;}}if(n==m){if(k>=90004)return 0*puts("0");return 0*printf("%lld\n",dp[n][k]);}long long ans=0;for(int i=0;i<=sumw;i++){if(dp[m][i]==0) continue;ans=(ans+dp[m][i]*C(k-i+(n-m)-1,(n-m)-1)%mod)%mod;}printf("%lld\n",ans);return 0;
}
转载于:https://www.cnblogs.com/JiuPleber/p/2019_3_15_T1.html
2019-3-15 模拟赛 T1相关推荐
- 洛谷 10月 csp-s 模拟赛 T1,T2解析及代码
洛谷 10月 csp-s 模拟赛 T1,T2解析及代码 T1 Magenta Potion 题目描述 给定一个长为 nnn 的整数序列 aaa,其中所有数的绝对值均大于等于 222.有 qqq 次操作 ...
- 【2019.7.16 NOIP模拟赛 T1】洗牌(shuffle)(找环)
找环 考虑每次洗牌其实是一次置换的过程,而这样必然就会有循环出现. 因此我们直接通过枚举找出每一个循环,询问时只要找到环上对应的位置就可以了. 貌似比我比赛时被卡成\(30\)分的倍增简单多了? 代码 ...
- 纪中20日c组模拟赛T1 2121. 简单游戏
T1 2121. 简单游戏 (File IO): input:easy.in output:easy.out 时间限制: 1000 ms 空间限制: 262144 KB 具体限制 Goto Pro ...
- 20161023 NOIP 模拟赛 T1 解题报告
Task 1.纸盒子 (box.pas/box.c/box.cpp) [题目描述] Mcx是一个有轻度洁癖的小朋友.有一天,当他沉溺于数学卷子难以自拔的时候,恍惚间想起在自己当初学习概率的时候准备的一 ...
- 20181225模拟赛 T1 color (转化思想,分拆思想)
题目: 有⼀块有 n 段的栅栏,要求第 i 段栅栏最终被刷成颜色 ci .每⼀次可以选择 l, r 把第l . . . r 都刷成某种颜色,后刷的颜⾊会覆盖之前的.⼀共有 m 种颜色,雇主知道只需要用 ...
- 7.9模拟赛T1图的遍历(dfs)
图的遍历(dfs) [题目描述] 对于一个有向图G来说,我们存在一个经典的遍历算法,就是DFS (深度优先搜索遍历).将G以1号点为起点进行DFS后,我们可以 得到G的一棵DFS遍历树T.就此,我们可 ...
- ztz11的noip模拟赛T1:愤怒的XiaoX
链接: https://www.luogu.org/problemnew/show/U47231 思路: 这道题其实就是一道双Lazy线段树裸题 因为我们知道,当k一定时,取反偶数次最后k位等于不取反 ...
- 9.20模拟赛T1[聪明的小偷]
聪明的小偷 (thief.pas/c/cpp) 袋,首先他会先检查每个口袋是不是都有硬币,之后他会计算出第 1 个和第 2 个口袋的硬币数量之和,第 2 个与第 3 个口袋的硬币数量和,如此直到第 n ...
- 【信奥题库 NOIP 2020 在线模拟赛 T1】有趣的函数
题目 https://www.oitiku.com/simulate-contest/5/16 思路 考试的时候思考方向错了,以为是递推 我们可以枚举有多少个e,那么可以计算出来要多少个2 然后我们就 ...
最新文章
- 设备节点监听--走在 input 分析之前
- GlusterFS的安装及使用
- 学mysql逻辑思维跟不上_关于避免MySQL替换逻辑SQL的坑爹操作详解
- python matplotlab在jupyter notebook中画图不显示怎么办?(%matplotlib inline)
- 软件测试理论入门(一)
- 实例43:python
- esd防护_电路级ESD防护方法
- Cloud一分钟 | 华为云发布云数据安全白皮书;OPPO携手阿里云举行天池OGeek算法挑战赛...
- iOS面试中经常问的点 - RunTime
- 虚拟化技术简介--CPU/内存/IO/网络虚拟化介绍
- Ubuntu安装teamviewer
- java中的原型模式_java中的原型模式理解
- console.log()中的运算与打印事件
- [渝粤教育] 西南科技大学 公共关系学 在线考试复习资料
- python基础之错误、调试(异常处理)
- POJ 2752 Seek the Name, Seek the Fame (KMP)
- 防止撤回插件 Android,微信防撤回插件
- skywalking elasticsearch 版本匹配问题
- java类库编程_进阶Java编程(5)基础类库
- 如何用u盘装xp系统教程
热门文章
- linux tomcat java heap space_Linux下tomcat JVM内存设置
- 计算机故障的分析原理,蓝屏含义、原理分析、处理方法 电脑计算机故障系统安全...
- list 索引 java_如何在Java中保持List索引的固定
- 中兴存储服务器 操作系统,中兴新支点服务器操作系统:企业级的国内服务器操作系统...
- html任务3 模拟滚动条,vue3系列:vue3.0自定义虚拟滚动条V3Scroll|vue3模拟滚动条组件...
- 【ruoyi】java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.ScheduledThreadPoo
- Request processing failed; nested exception is feign.RetryableException: Read timed out
- python中cgi到底是什么_什么是CGI?详细介绍Python CGI编程
- 手机python软件怎么创建项目_pycharm怎么创建项目
- Npm如何升级package.json