AtCoder AGC009E Eternal Average (DP)
题目链接
https://atcoder.jp/contests/agc009/tasks/agc009_e
题解
又被劝退了。。。
第一步转化非常显然: 就等价于一开始有一个数\(1\), 有\(\frac{n+m-1}{k-1}\)次机会每次选择一个数把它变成\(k\)个原来的\(\frac{1}{k}\), 最后从\(n+m\)个数中选出\(m\)个,问能选出多少不同的数。
然后考虑化成\(k\)进制小数,假设最后形成的数是\(d_1,d_2,...,d_{n+m}\), 则\(\sum^{n+m}_{i=1} d_i=1\).
一个\(d\)进制小数可以被表示成\(m\)个\(k\)的负整数次幂之和当且仅当其每一位数值之和不超过\(m\)且和\(m\)模\((k-1)\)同余。(显然)
但同时还要保证\(1\)可以被表示成\((n+m)\)个\(k\)的负整数次幂之和,且包含这\(m\)个数。那么就可以转化成\(1\)减这个小数可以被表示成\(n\)个\(k\)的负整数次幂之和。(行吧我就这一步没想出来……自闭了啊……)
所以最后也就是要计算有多少个序列\(a_1,a_2,...,a_l\ (1\le l\le \frac{n+m-1}{k-1})\), 满足\(0\le a_i\le k-1, a_l>0, \sum^l_{i=1}a_i\le m,\sum^l_{i=1}a_i\equiv m(\mod k-1), \sum^l_{i=1}k-1-a_i\le n-1, \sum^l_{i=1}k-1-a_i\equiv n-1(\mod k-1)\), 直接dp即可。时间复杂度\(O((n+m)k)\).
代码
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cassert>
#define llong long long
using namespace std;
const int N = 4e3;
const int P = 1e9+7;
llong dp[N+3][N+3],sdp[N+3][N+3];
int n1,n2,m,len;
llong ans;
int main()
{
scanf("%d%d%d",&n1,&n2,&m); len = (n1+n2-1)/(m-1);
dp[0][0] = 1ll; for(int j=0; j<=n2; j++) sdp[0][j] = 1;
for(int i=1; i<=len; i++)
{
for(int j=0; j<=n2; j++)
{
if(j>=m) {dp[i][j] = (sdp[i-1][j]-sdp[i-1][j-m]+P)%P;}
else {dp[i][j] = sdp[i-1][j];}
if((n2-j)%(m-1)==0 && i*(m-1)-j<=n1-1 && (n1-1-i*(m-1)+j)%(m-1)==0) {ans = (ans+dp[i][j]-dp[i-1][j]+P)%P;}
}
sdp[i][0] = dp[i][0]; for(int j=1; j<=n2; j++) sdp[i][j] = (sdp[i][j-1]+dp[i][j])%P;
}
printf("%lld\n",ans);
return 0;
}
AtCoder AGC009E Eternal Average (DP)的更多相关文章
- AGC009E Eternal Average
atc 神题orz 那个擦掉\(k\)个数然后写上一个平均值可以看成是\(k\)叉Huffman树的构造过程,每次选\(k\)个点合成一个新点,然后权值设为平均值.这些0和1都会在叶子的位置,同时每个 ...
- 【AGC009E】Eternal Average
[AGC009E]Eternal Average 题面 洛谷 题解 神仙题.jpg 我们把操作看成一棵\(k\)叉树,其中每个节点有权值,所有叶子节点(共\(n+m\)个)就是\(0\)或\(1\). ...
- AtCoder Grand Contest 009 E:Eternal Average
题目传送门:https://agc009.contest.atcoder.jp/tasks/agc009_e 题目翻译 纸上写了\(N\)个\(1\)和\(M\)个\(0\),你每次可以选择\(k\) ...
- AtCoder AGC001E BBQ Hard (DP、组合计数)
题目链接: https://atcoder.jp/contests/agc001/tasks/agc001_e 题解: 求\(\sum^n_{i=1}\sum^n_{j=i+1} {A_i+A_j+B ...
- AtCoder AGC004E Salvage Robots (DP)
题目链接 https://atcoder.jp/contests/agc004/tasks/agc004_e 题解 本题的难度不在于想到大体思路,而在于如何把代码写对.. 首先我们可以不让机器人动,让 ...
- AtCoder AGC032D Rotation Sort (DP)
题目链接 https://atcoder.jp/contests/agc032/tasks/agc032_d 题解 又是一道神仙题啊啊啊啊...atcoder题真的做不来啊QAQ 第一步又是神仙转化: ...
- Atcoder ARC101 E 树dp
https://arc101.contest.atcoder.jp/tasks/arc101_c 题解是也是dp,好像是容斥做的,但是看不懂,而且也好像没讲怎么变n^2,看了写大佬的代码,自己理解了一 ...
- AtCoder AGC002F Leftmost Ball (DP、组合计数)
题目链接: https://atcoder.jp/contests/agc002/tasks/agc002_f 题解: 讲一下官方题解的做法: 就是求那个图(官方题解里的)的拓扑序个数,设\(dp[i ...
- Atcoder C - Vacation ( DP )
C - Vacation Time Limit: 2 sec / Memory Limit: 1024 MB Score : 100100 points Problem Statement Taro' ...
随机推荐
- DVWA之SQL注入演练(low)
1.设置 把安全等级先调整为low,让自己获得点信心,免得一来就被打脸. 2.测试和分析页面的功能 这里有一个输入框 根据上面的提示,输入用户的id.然后我们输入之后,发现它返回了关于这个 ...
- 开发过程遇到的css样式问题记录
一.移动端 1.部分安卓机圆角border-radius失效,显示为方形状? background-clip: padding-box; 2.部分安卓机字体图标出现锯齿? 使用iconfont图标 ...
- XML转换成DataTable
#region XML转dataset //str 是xml字符串 public static DataTable GetResultXMLToDataTable (string str,string ...
- centos中mariadb的相关操作
Tip 1 在使用mariadb中启动服务报错 : Failed to start mariadb.service: Unit not found. 解决办法: yum install -y mari ...
- opencv ORB各参数的含义
ORB中有很多参数可以设置,在OpenCV中它可以通过ORB来创建一个ORB检测器. ORB::ORB(int nfeatures=500, float scaleFactor=1.2f, int n ...
- XSS防御和绕过1
原理:对用户输入没做过滤和处理,是用户可以输入一些东西(例如js),控制输出达到一些攻击目的 1.DOM型 基于DOM的XSS有时也称为type0XSS.当用户能够通过交互修改浏览器页面中的DOM(D ...
- wabacus JaveEE开发框架
http://www.wabacus.org/ css学习网站:http://www.divcss5.com/rumen/r422.shtml
- 安装.Net Framework 2.0出现 Error 25015
---------------------------Microsoft .NET Framework 2.0 安装程序---------------------------Error 25015.安 ...
- shell脚本视频学习1
一.知识点:变量,参数传递 练习1:使用shell脚本,输出当前所在的目录 练习2:计算/etc目录下有多少个文件,用shell脚本实现 ls -l--->数一下, ls -l|wc -l ( ...
- 分布式消息中间件之kafka设计思想及基本介绍(一)
Kafka初探 场景->需求->解决方案->应用->原理 我该如何去设计消息中间件--借鉴/完善 场景 跨进程通信(进程间生产消费模型) 需求 基本需求 实现消息的发送和接收. ...