AT2294 Eternal Average
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的更多相关文章
- 【AGC009E】Eternal Average
[AGC009E]Eternal Average 题面 洛谷 题解 神仙题.jpg 我们把操作看成一棵\(k\)叉树,其中每个节点有权值,所有叶子节点(共\(n+m\)个)就是\(0\)或\(1\). ...
- AGC009:Eternal Average
传送门 好神啊 直接考虑一棵 \(n+m\) 个叶子的 \(k\) 叉树,根结点权值为 \(\sum_{i\in m}(\frac{1}{k})^{deep_i}\) 对于一个 \(deep\) 的序 ...
- AtCoder Grand Contest 009 E:Eternal Average
题目传送门:https://agc009.contest.atcoder.jp/tasks/agc009_e 题目翻译 纸上写了\(N\)个\(1\)和\(M\)个\(0\),你每次可以选择\(k\) ...
- AtCoder AGC009E Eternal Average (DP)
题目链接 https://atcoder.jp/contests/agc009/tasks/agc009_e 题解 又被劝退了... 第一步转化非常显然: 就等价于一开始有一个数\(1\), 有\(\ ...
- AGC009E Eternal Average
atc 神题orz 那个擦掉\(k\)个数然后写上一个平均值可以看成是\(k\)叉Huffman树的构造过程,每次选\(k\)个点合成一个新点,然后权值设为平均值.这些0和1都会在叶子的位置,同时每个 ...
- ZJOI2017 Day2
私のZJOI Day2 2017-3-22 08:00:07 AtCoder试题选讲 SYC(Sun Yican) from Shaoxing No.1 High School 2017-3-22 0 ...
- AtCoder Grand Contest 009
AtCoder Grand Contest 009 A - Multiple Array 翻译 见洛谷 题解 从后往前考虑. #include<iostream> #include< ...
- AtCoder Grand Contest
一句话题解 QwQ主要是因为这篇文章写的有点长……有时候要找某一个题可能不是很好找,所以写了这个东西. 具体的题意.题解和代码可以再往下翻._(:з」∠)_ AGC 001 C:枚举中点/中边. D: ...
- A`>G?~C009
A`>G?~C009 这场怎么才5题...看完猫的提交记录以为猫猫没写这场F A Multiple Array 直接做 B Tournament 直接树d C Division into Two ...
随机推荐
- Codeforces Round #325 (Div. 2) B. Laurenty and Shop 有规律的图 暴力枚举
B. Laurenty and Shoptime limit per test1 secondmemory limit per test256 megabytesinputstandard input ...
- hdu_1712(dp,背包)
hdu_1712 \[dp[i][j]\] 表示前i个物品用了j天得到的最大收益 \[ dp[i][j] = max(dp[i-1][j],dp[i][j-k]+ k*v[i][k]) \qquad ...
- Qtcreator 之中文目录
由于编码格式问题, qtcreator 所有关于目录的引用和存放均不出现中文,否则编译可以通过,运行时 crashed !!!
- CodeForces 352C Jeff and Rounding
题意 有一个含有\(2n(n \leqslant2000)\)个实数的数列,取出\(n\)个向上取整,另\(n\)个向下取整.问取整后数列的和与原数列的和的差的绝对值. 就是说,令\(a\)为原数列, ...
- Express + Mongoose 极简入门
今天尝试使用express + mongoose,构建了一个简单的Hello world,实现以下功能: 定义mongodb使用的Schema,一个User 访问/输出Hello world 访问/i ...
- SQL查询时踩得一些坑
1.左右连接: left join:LEFT JOIN返回左表的全部行和右表满足ON条件的行,如果左表的行在右表中没有匹配,那么这一行右表中对应数据用NULL代替. inner join: 内连接是最 ...
- C++入门经典-例6.13-指针与二维数组
1:代码如下: // 6.13.cpp : 定义控制台应用程序的入口点. // #include"stdafx.h" #include<iostream> using ...
- Maven项目解决Remove '@override' annotation终极方案
特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...
- spark 笔记 3:Delay Scheduling: A Simple Technique for Achieving Locality and Fairness in Cluster Scheduling
spark论文中说他使用了延迟调度算法,源于这篇论文:http://people.csail.mit.edu/matei/papers/2010/eurosys_delay_scheduling.pd ...
- log4j.properties 文件,放在 src 下
log4j.rootLogger=INFO,CONSOLE,ERRORLOGlog4j.appender.CONSOLE=org.apache.log4j.ConsoleAppenderlog4j.a ...