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' ...
随机推荐
- 论文笔记-IGCV3:Interleaved Low-Rank Group Convolutions for Efficient Deep Neural Networks
论文笔记-IGCV3:Interleaved Low-Rank Group Convolutions for Efficient Deep Neural Networks 2018年07月11日 14 ...
- ubutnu18.04LTS 配置网卡新特性
在Ubuntu16的时候配置网卡信息都是在 /etc/network/interfaces 下的,但是到了18,配置文件位置改为了/etc/netplan/*.yaml,配置配置内容如下: netwo ...
- 【POI】使用POI 创建生成XLS,打开xls文件提示【此文件中某些文本格式可能已经更改,因为它已经超出最多允许的字体数。】
使用POI 创建生成XLS,打开xls文件提示[此文件中某些文本格式可能已经更改,因为它已经超出最多允许的字体数.] 原因: 是因为在POI处理xls的过程中,太多次调用了: HSSFFont fon ...
- JavaScript设计模式(单例模式)
单例模式是一种简单但非常实用的模式,特别是惰性单例技术,在合适的时候才创建对象,并且只创建唯一的一个.下面我们来逐步了解单例模式的用法. 一.简版单例模式: var Singleton = funct ...
- merge into使用方法
此外,You cannot update a column that is referenced in the ON condition clause.,update的字段不可以是on里面的条件字段, ...
- SIP笔记
消息代号: 1)1XX:临时响应,表示请求消息正在被处理. 2)2XX:成功响应,表示请求已被成功接收,完全理解并被接受. 3)3XX:重定向响应,表示需采取进一步以完成该请求. 4)4XX:客户机错 ...
- vue中params-解决换路由不刷新问题
因为依赖路由的params参数获取写在created生命周期里面,因为相同路由二次甚至多次加载的关系 没有达到监听,退出页面再进入另一个文章页面并不会运行created组件生命周期,导致文章数据还是第 ...
- Delphi ActiveX的使用
樊伟胜
- 《python解释器源码剖析》第6章--python中的dict对象
6.0 序 元素和元素之间可能存在着某种关系,比如学生姓名和成绩.我希望能够通过学生的姓名找到这个学生的成绩,那么只需要将两者关联起来即可.字典正是这么做的,字典中的每个元素就是一个key:value ...
- BLE 5协议栈-通用属性规范层(GATT)
文章转载自:http://www.sunyouqun.com/2017/04/page/2/ 通用属性规范GATT(Generic Attribute Profile)将ATT层定义的属性打包成不同的 ...