题目链接

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)相关推荐

  1. AtCoder AGC043D Merge Triplets (DP、组合计数)

    题目链接 https://atcoder.jp/contests/agc043/tasks/agc043_d 题解 考场上想到正确做法,然后思考实现细节的时候做法逐渐扭曲,最后GG--考后睡了一觉冷静 ...

  2. AtCoder AGC004E Salvage Robots (DP)

    题目链接 https://atcoder.jp/contests/agc004/tasks/agc004_e 题解 本题的难度不在于想到大体思路,而在于如何把代码写对.. 首先我们可以不让机器人动,让 ...

  3. AtCoder AGC032D Rotation Sort (DP)

    题目链接 https://atcoder.jp/contests/agc032/tasks/agc032_d 题解 又是一道神仙题啊啊啊啊...atcoder题真的做不来啊QAQ 第一步又是神仙转化: ...

  4. AtCoder AGC002F Leftmost Ball (DP、组合计数)

    题目链接: https://atcoder.jp/contests/agc002/tasks/agc002_f 题解: 讲一下官方题解的做法: 就是求那个图(官方题解里的)的拓扑序个数,设\(dp[i ...

  5. 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 ...

  6. Atcoder ARC101 E 树dp

    https://arc101.contest.atcoder.jp/tasks/arc101_c 题解是也是dp,好像是容斥做的,但是看不懂,而且也好像没讲怎么变n^2,看了写大佬的代码,自己理解了一 ...

  7. AtCoder Beginner Contest 266(C- G)「判凸包」「dp」「期望」「基环树」「组合数」

    abc好好好. C - Convex Quadrilateral (atcoder.jp) 思路: 判凸包,向量叉积×=|a|*|b|*sin.叉积<0即角>180°. (可以勉勉强强算我 ...

  8. 【AtCoder】AGC009

    AGC009 A - Multiple Array 从后往前递推即可 #include <bits/stdc++.h> #define fi first #define se second ...

  9. 【学习笔记】AGC009/AGC019/AGC029/AGC035

    AGC009 Eternal Average 奥妙重重 如果我们用树的结构来描述操作,设一个点的深度为xix_ixi​,那么一定满足∑k−xi=1\sum k^{-x_i}=1∑k−xi​=1,并且 ...

最新文章

  1. Linux 内核测试版与稳定版的版本号有什么不同?
  2. 存储过程同函数的区别
  3. Column 'Status' in where clause is ambiguous
  4. JDBC:java.sql.SQLException: Before start of result set怎么办
  5. 工作66:storage区别
  6. 有三个数a,b,c,要求按大小顺序输出。
  7. JVM—内存分配与回收策略
  8. 金蝶系统怎么清理服务器,【金蝶KIS专业版】如何注销加密服务器记录
  9. Windows系统 notepad命令详解,Windows系统打开记事本
  10. 你不知道的 CSS 文档流技巧,让布局更简单
  11. element ui 点击修改开启停用按钮状态
  12. Dubbo集成Spring与Zookeeper实例
  13. VS2005发布网站问题及aspnet_merge.exe”已退出,代码为 1的错误以及所有代码文件生成一个dll
  14. EXSi虚拟机缺少vmdk文件报错问题
  15. 常见的肾囊肿症状有哪些?
  16. WS2812B彩灯 STM32HAL库开发:PWM+DMA(stm32f103c8t6)
  17. 声音大小与振幅的关系_物理常考点问答-响度与振幅有什么关系?
  18. 大工2021年11月份《电气制图与CAD》课程设计离线作业
  19. 【生活】驾照C1-科一手册
  20. 草根大牛论道“下一代软件研发” 开启软件转型讨论大潮

热门文章

  1. [C++调试笔记]define.h
  2. 云炬Qtpy5开发与实战笔记 0搭建开发环境(傻瓜式安装)
  3. 2-3 人工智能需要的基本数学知识|人工智能框架TensorFlow应用实践
  4. MSSQL的多层嵌套查询
  5. .Net开发中的多线程编程总结
  6. system函数-linux
  7. 对EditText右边的图片进行监听
  8. 程序员面试系列——约瑟夫环
  9. Spring学习总结二
  10. MyBatis-Plus 高级功能 —— 自动填充功能