【AGC009E】Eternal Average

题面

洛谷

题解

神仙题.jpg

我们把操作看成一棵\(k\)叉树,其中每个节点有权值,所有叶子节点(共\(n+m\)个)就是\(0\)或\(1\)。

出了叶子节点外的所有节点就代表一次合并,权值就是他们的平均值。

设一开始\(0\)点的深度分别为\(x_1,x_2...x_n\),\(1\)的深度为\(y_1,y_2...y_m\)。

那么根节点的权值为\(\sum (\frac 1k) ^ {y_i}\),而如果我们将所有点的权值改为\(1\),则根节点权值也为\(1\),那么有\(\sum (\frac 1k) ^ {x_i}+\sum (\frac 1k) ^ {y_i}=1\),而如果满足这个条件,则一定可以构造出一种方案。

那么问题转化为有多少个\(z\)能写成\(n\)个\((\frac 1k)^x\),\(1-z\)能写成\(m\)个\((\frac 1k)^y\)相加的形式。

我们将\(z\)表示为\((0.c_1c_2...)_k\),那么若不进位\(\sum c=m\),而进位的话进位一次就减去\(k-1\),那么\(\sum c=m(\bmod\;k-1)\)。

假设小数有\(len\)位,那么\(1-z\)的和应为\((len-1)(k-1)+k-\sum c=len(k-1)-\sum c+1\)。

然后设\(f_{i,j}\)表示到第\(i\)位,目前和为\(j\)的方案数即可,因为末尾不能为\(0\),所以要多开一维记一下最后一位是否为\(0\)。

(大量参考litble的题解)

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int Mod = 1e9 + 7;
const int MAX_N = 2e3 + 5;
int N, M, K, ans;
int f[MAX_N << 1][MAX_N][2], s[MAX_N]; int main () {
cin >> N >> M >> K;
f[0][0][0] = 1;
for (int i = 1; i <= N + M; i++) {
s[0] = (f[i - 1][0][0] + f[i - 1][0][1]) % Mod;
for (int j = 1; j <= N; j++)
s[j] = (s[j - 1] + (f[i - 1][j][0] + f[i - 1][j][1]) % Mod) % Mod;
for (int j = 0; j <= N; j++) {
f[i][j][0] = (f[i - 1][j][0] + f[i - 1][j][1]) % Mod;
if (j) f[i][j][1] = (s[j - 1] - (j - K >= 0 ? s[j - K] : 0) + Mod) % Mod;
}
for (int j = 0; j <= N; j++)
if (j % (K - 1) == N % (K - 1) &&
(i * (K - 1) - j + 1) % (K - 1) == M % (K - 1) &&
i * (K - 1) - j + 1 <= M)
ans = (ans + f[i][j][1]) % Mod;
}
printf("%d\n", ans);
return 0;
}

【AGC009E】Eternal Average的更多相关文章

  1. 【Leetcode_easy】637. Average of Levels in Binary Tree

    problem 637. Average of Levels in Binary Tree 参考 1. Leetcode_easy_637. Average of Levels in Binary T ...

  2. 【leetcode】637. Average of Levels in Binary Tree

    原题 Given a non-empty binary tree, return the average value of the nodes on each level in the form of ...

  3. 【LeetCode】637. Average of Levels in Binary Tree 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:DFS 方法二:BFS 日期 题目地址:ht ...

  4. 【CF61D】Eternal Victory

    题目大意:给定一棵 N 个节点的树,求从 1 号节点(根节点)出发,任意节点结束,且至少经过每个节点一次的最短路径是多少. 题解:首先考虑最终要回到根节点的情况,可以发现最短路径长度一定等于该树边权的 ...

  5. 【LeetCode】二分 binary_search(共58题)

    [4]Median of Two Sorted Arrays [29]Divide Two Integers [33]Search in Rotated Sorted Array [34]Find F ...

  6. 【LeetCode】队列 queue(共8题)

    [346]Moving Average from Data Stream [353]Design Snake Game [363]Max Sum of Rectangle No Larger Than ...

  7. 【LeetCode】设计题 design(共38题)

    链接:https://leetcode.com/tag/design/ [146]LRU Cache [155]Min Stack [170]Two Sum III - Data structure ...

  8. 【原创】开源Math.NET基础数学类库使用(11)C#计算相关系数

                   本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...

  9. 看懂SqlServer查询计划【转】

    原文链接:http://www.cnblogs.com/fish-li/archive/2011/06/06/2073626.html 开始 SQL Server 查找记录的方法 SQL Server ...

随机推荐

  1. i2c的读写时序图

    根据实际示波器的波形画的时序图,时序图不好画,小小一幅图,画了两个小时,分享之:

  2. 局域网Linux机器中病毒简单处理 .aliyun.sh 挖矿病毒 ---不彻底

    1. 昨天晚上同事打电话给我说自己的服务器上面的redis无故被清空了,并且查看aof 日志有很多 wget和write指令 一想就是大事不好.局域网中病毒了.. 2. 今天早上到公司忙完一阵简单看了 ...

  3. Linux下用source insight的另一种方式--Samba

    花了一些时间想找一个在Linux下的类似source insight的东东,网上有人推荐的source navigator,kscope之类,就那么几种颜色(也许没深入设置),也能叫语法高亮?至于其他 ...

  4. java 中遍历Map的几种方法

    方法分为两类: 一类是基于map的Entry:map.entrySet(); 一类是基于map的key:map.keySet() 而每一类都有两种遍历方式: a.利用迭代器 iterator: b.利 ...

  5. Fuck SELinux :rsyslog无法生成log文件,原来是selinux机制搞的鬼!

    Fuck SELinux 一万年! 关闭即可.

  6. .net Core 学习笔记(实体字段映射,IOC注入)

    https://github.com/wj1034184751/ADO.NetCore.git 先简单的做一个学习架子, EF层用的是 EFCore(2.1.0)+ Pomelo.EntityFram ...

  7. C#循环 — break VS continue

    一.简介 1.break语句:循环-循环中断并停止,退出当前循环: 流程图: 2.continue:循环-循环下一次迭代继续执行. 流程图: 执行过程:立即结果本次循环,判断循环条件,如果成立,则进入 ...

  8. 使用Docker之镜像的拉取、查询、删除

    1:查看镜像列表 2:拉取镜像    通过命令可以从镜像仓库中拉取镜像,默认从Docker Hub 获取. 命令格式: docker image pull <repository>:< ...

  9. 2019 博盾习言java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.博盾习言等公司offer,岗位是Java后端开发,因为发展原因最终选择去了博盾习言,入职一年时间了,也成为了面 ...

  10. 如何提升Web前端性能?

    什么是WEB前端呢?就是用户电脑的浏览器所做的一切事情.我们来看看用户访问网站,浏览器都做了哪些事情:输入网址 –> 解析域名 -> 请求页面 -> 解析页面并发送页面中的资源请求 ...