AGC009E Eternal Average

AGC009E Eternal Average

https://atcoder.jp/contests/agc009/tasks/agc009_e

将模型转化为一个 k 叉树,每个点要么是叶子,要么恰好有 k 个儿子
然后叶子节点有 n+m 个,权值 0 或 1,非叶子节点的权值是所有子节点的平均值
这样根的权值就是最后剩的那个数
设根的深度为 0,权值为 1 的点深度分别是 xi,为 0 的分别是 yi
则权值为 0 的没贡献,根节点的权值是 kxi
如果 n+m 个点都是权值为 1,则根权值也是 1,那么就推出了 kxi+kyi=1

此题即为求有多少个 Z,使得 Z=kxi,1Z=kyi
那么设 k 进制小数 Z=(0.z1z2zl)k,因为 Z 要写成 kxi,所以 zin,也就是最多只有 k 进制下 n1
那么从 1 最多的情况往后推,每次进位,所有位的和减小 k1,所以可以得出 zin(modk1)

模拟一下小数减法的过程,再针对 1Z=kyi 这个式子,可以仿照上面的过程推出 1+(k1zi)m1+(k1zi)m(modk1)

所以就是要求有多少个小数 Z,使得满足一下几个式子

0zi<k,i[1,l1]

0<zl<k

zin

zin(modk1)

1+(k1zi)m

1+(k1zi)m(modk1)

所以可以来一个 dp,用 f(i,j,0/1) 表示考虑 l=i,也就是 Zi 位时,zi=jzi 等于/不等于 0 的方案数
转移:f(i,j,0)=f(i1,j,0)+f(i1,j,1)
f(i,j,1)=x=1k1f(i1,jx,0)+f(i1,jx,1)

记一个前缀和优化一下就行了
因为没有规定 l 的大小,所以每当枚举完一个 i,就去找所有符合上面几个式子要求的 j 来加到答案里

另外一个细节,就是 i 最大枚举到多少,其实通过联立第三个和第五个式子可以发现,ln+m1k1,这也就是 i 的最大值

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<map>
#define reg register
inline int read(){
	register int x=0;register int y=0;
	register char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')y=1;c=getchar();}
	while(c>='0'&&c<='9') x=x*10+c-48,c=getchar();
	return y?-x:x;
}
#define mod 1000000007
int n,m,k;
int sum[2006];
int f[4006][2006][2];
int main(){
	n=read();m=read();k=read();
	f[0][0][0]=1;
	int max=n+m,ans=0;
	for(reg int i=1;i<=max;i++){
		sum[0]=(f[i-1][0][0]+f[i-1][0][1])%mod;
		for(reg int j=1;j<=n;j++) sum[j]=((f[i-1][j][0]+f[i-1][j][1])%mod+sum[j-1])%mod;
		f[i][0][0]=sum[0];
		for(reg int j=1;j<=n;j++){
			f[i][j][0]=(sum[j]-sum[j-1]+mod)%mod;
			f[i][j][1]=(sum[j-1]-(j-k>=0?sum[j-k]:0)+mod)%mod;
		}
		for(reg int j=0;j<=n;j++)
			if(j%(k-1)==n%(k-1)&&1+(k-1)*i-j<=m&&(1+(k-1)*i-j)%(k-1)==m%(k-1))
				ans=(ans+f[i][j][1])%mod;
	}
	printf("%d",ans);
	return 0;
}
posted @   suxxsfe  阅读(184)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?

This blog has running: 1856 days 1 hours 59 minutes 46 seconds

Copyright © 2025 suxxsfe
Powered by .NET 9.0 on Kubernetes
点击右上角即可分享
微信分享提示