Link

题目给我们的这个东西可以转化为一棵\(k\)叉树,有\(n+m\)个叶子节点,其中\(m\)个权值为\(1\),\(n\)个权值为\(0\),每个非叶子节点的权值为其儿子的平均值,现在问你根节点的权值有多少种取值。

转化之后发现似乎可做了一点。(当然还是一道神仙题)

我们设\(n\)个权值为\(0\)的叶子节点的深度为\(x_1\sim x_n\),\(m\)个权值为\(1\)的叶子节点的深度为\(y_1\sim y_m\),根节点的权值为\(z\)。

那么有\(\sum\limits_{i=1}^mk^{-y_i}=z\)。

并且如果我们把所有叶子节点的权值都设为\(1\),那么树上所有点的权值都为\(1\),\(\sum\limits_{i=1}^mk^{-y_i}+\sum\limits_{i=1}^nk^{-x_i}=1\)即\(\sum\limits_{i=1}^nk^{-x_i}=1-z\)。

我们将\(z\)写成\(k\)进制下的小数形式,\(z=0.\overline{c_1\cdots c_l}\)。

那么对于一个\(k^{-y_i}\),它会让\(c_{y_i}+1\)。

因此在不考虑进位的情况下,\(\sum\limits_{i=1}^lc_i=m\)。

进位实质上就是某一位\(-k\),高位\(+1\),反映到数位和上就是\(-(k-1)\)。

因此在考虑进位的情况下,\(\sum\limits_{i=1}^lc_i\equiv m(\mod k-1)\)。

当然也有\(\sum\limits_{i=1}^lc_i\le m\)。

对\(1-z\)做类似的分析。

我们可以发现\(1-z\)的数位和就是\(\sum\limits_{i=1}^l(k-1-c_i)+1=l(k-1)+1-\sum\limits_{i=1}^lc_i\)。

后面那坨就是\(z\)的数位和对吧。

与求\(z\)的数位和的性质的过程类似,我们有\(l(k-1)+1-\sum\limits_{i=1}^lc_i\equiv n(\mod k-1)\)。

以及\(l(k-1)+1-\sum\limits_{i=1}^lc_i\le n\)。

那么我们就可以设计一个数位dp了。

首先这个\(k\)叉树的深度最多为\(\frac{n+m-1}{k-1}\),也就是说\(z\)和\(1-z\)最多有\(\frac{n+m-1}{k-1}\)位。

我们设\(f_{i,j,k}\)表示考虑前\(i\)位小数,数位和为\(j\)时的方案数。注意到小数不能存在后导\(0\),我们再开一维\(k\)表示最后一位是不是\(0\)。

那么有\(f_{i,j,0}=f_{i-1,j,0}+f_{i-1,j,1}\),

以及\(f_{i,j,1}=\sum\limits_{o=\max(0,j-k)}^{j-1}(f_{i-1,o,0}+f_{i-1,o,1})\)。

前缀和优化一下就行了。

求答案的时候判一下第二维是否满足上面的\(z\)和\(1-z\)的\(4\)个条件(\(\sum c\le m\)的实际上可以不用判,因为循环里面最多跑到了\(m\)),而且注意一下只能加第三维为\(1\)的答案。

#include<cstdio>
#include<cctype>
const int N=2007,P=1000000007;
int inc(int a,int b){return a+=b,a>=P? a-P:a;}
int dec(int a,int b){return a-=b,a<0? a+P:a;}
int read(){int x;scanf("%d",&x);return x;}
int f[N<<1][N][2],s[N];
int main()
{
int n=read(),m=read(),k=read(),i,j,ans=0;
f[0][0][0]=1;
for(i=1;i<=(n+m-1)/(k-1);++i)
{
s[0]=inc(f[i-1][0][1],f[i-1][0][0]);
for(j=1;j<=m;++j) s[j]=inc(s[j-1],inc(f[i-1][j][0],f[i-1][j][1]));
for(j=0;j<=m;++j)
{
f[i][j][0]=inc(f[i-1][j][0],f[i-1][j][1]);
if(j) f[i][j][1]=dec(s[j-1],(j>=k? s[j-k]:0));
}
for(j=0;j<=m;++j) if(j%(k-1)==m%(k-1)&&(i*(k-1)+1-j)%(k-1)==n%(k-1)&&i*(k-1)+1-j<=n) ans=inc(ans,f[i][j][1]);
}
printf("%d",ans);
}

AT2294 Eternal Average的更多相关文章

  1. 【AGC009E】Eternal Average

    [AGC009E]Eternal Average 题面 洛谷 题解 神仙题.jpg 我们把操作看成一棵\(k\)叉树,其中每个节点有权值,所有叶子节点(共\(n+m\)个)就是\(0\)或\(1\). ...

  2. AGC009:Eternal Average

    传送门 好神啊 直接考虑一棵 \(n+m\) 个叶子的 \(k\) 叉树,根结点权值为 \(\sum_{i\in m}(\frac{1}{k})^{deep_i}\) 对于一个 \(deep\) 的序 ...

  3. AtCoder Grand Contest 009 E:Eternal Average

    题目传送门:https://agc009.contest.atcoder.jp/tasks/agc009_e 题目翻译 纸上写了\(N\)个\(1\)和\(M\)个\(0\),你每次可以选择\(k\) ...

  4. AtCoder AGC009E Eternal Average (DP)

    题目链接 https://atcoder.jp/contests/agc009/tasks/agc009_e 题解 又被劝退了... 第一步转化非常显然: 就等价于一开始有一个数\(1\), 有\(\ ...

  5. AGC009E Eternal Average

    atc 神题orz 那个擦掉\(k\)个数然后写上一个平均值可以看成是\(k\)叉Huffman树的构造过程,每次选\(k\)个点合成一个新点,然后权值设为平均值.这些0和1都会在叶子的位置,同时每个 ...

  6. ZJOI2017 Day2

    私のZJOI Day2 2017-3-22 08:00:07 AtCoder试题选讲 SYC(Sun Yican) from Shaoxing No.1 High School 2017-3-22 0 ...

  7. AtCoder Grand Contest 009

    AtCoder Grand Contest 009 A - Multiple Array 翻译 见洛谷 题解 从后往前考虑. #include<iostream> #include< ...

  8. AtCoder Grand Contest

    一句话题解 QwQ主要是因为这篇文章写的有点长……有时候要找某一个题可能不是很好找,所以写了这个东西. 具体的题意.题解和代码可以再往下翻._(:з」∠)_ AGC 001 C:枚举中点/中边. D: ...

  9. A`>G?~C009

    A`>G?~C009 这场怎么才5题...看完猫的提交记录以为猫猫没写这场F A Multiple Array 直接做 B Tournament 直接树d C Division into Two ...

随机推荐

  1. TTTTTTTTTTTTT poj 3057 Evacuation 二分图匹配+bfs

    题意:见挑战230页 #include <iostream> #include <cstdio> #include <cstring> #include <c ...

  2. 12.Python数值类型(整形、浮点型和复数)及其用法

    实际开发中,我们经常需要使用数字记录游戏中用户的得分.游戏中角色的生命值.伤害值等信息,Python 语言提供了数值类型用于保存这些数值. 需要注意的是,Python 中这些数值类型都是不可改变的,也 ...

  3. 缓存区溢出之slmail fuzzing

    这是我们的实验环境 kali 172.18.5.118smtp windows2003  172.18.5.117  pop3 110 smtp 25 本机 172.18.5.114 已经知道slma ...

  4. Java线程细节

    启动一个线程是用  run() 还是 start()?启动一个线程是调用 start()方法,启动线程并调用 run 方法 线程的基本概念.线程的基本状态以及状态之间的关系线程是进程内的并发,没有自已 ...

  5. 百度地图api服务端根据经纬度得到地址

    package com.haiyisoft.cAssistant.mapApi; import java.io.BufferedReader;import java.io.IOException;im ...

  6. Dark 面向对象

    1 继承 使用extends继承一个类 子类会继承父类可见的属性和方法,不包含构造方法 可以复写父类的方法 单继承,多态性 构造方法 子类的构造方法会默认调用父类的无名无参构造方法 如果父类没有无名无 ...

  7. Could not parse configuration: /hibernate.cfg.xml

    hibernate需要联网验证dtd,错误原因:未联网或网速不行

  8. jenkins docker 发布

    分享下怎么使用jenkins 发布 docker   首先准备docker的相关部分 docker tomcat基础镜像,这边使用centos7做系统,dockerfile如下: #tomcat基础镜 ...

  9. LoadRunner遇到的问题

    1. :

  10. (WPF)360安全卫士界面设计

    点击下载 <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation&qu ...