把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

AT2294 [AGC009E] Eternal Average

题目传送门

考虑求值的过程,容易发现我们会形成一颗k叉树,然后最后的总和是每个1点对应的深度的1k次幂和。

容易发现在同一层有k个同样的点可以用下一层1个点代替并删除上面k个点,因此我们只要对任意nn(modk1),mm(modk1)的点对(n,m)计数有n+m1k1层,最上面一层有k个,以后每层k1个,1的个数和为m,并且最上面一层不能同为一个数的方案数。容易dp转移,时间复杂度O(nm)。注意到外围的循环是O(n+mk)级别的,因此内层暴力O(k)转移复杂度也是对的。

code:

#include<bits/stdc++.h>
#define I inline
#define ll long long
#define db double
#define lb long db
#define N (2000+5)
#define M ((1<<14)+5)
#define K (700+5)
#define mod 1000000007
#define Mod (mod-1)
#define eps (1e-5)
#define ui unsigned int
#define ull unsigned ll
#define Gc() getchar() 
#define Me(x,y) memset(x,y,sizeof(x))
#define Mc(x,y) memcpy(x,y,sizeof(x))
#define d(x,y) ((k+1)*(x)+(y))
#define R(n) (rnd()%(n)+1)
#define Pc(x) putchar(x)
#define LB lower_bound
#define UB upper_bound
#define PB push_back
using namespace std;
int n,m,k;ll ToT,f[N],g[N]; 
int main(){
	freopen("1.in","r",stdin);
	int i,j;scanf("%d%d%d",&n,&m,&k);for(i=1;i<=(n+m-1)/(k-1);i++){
		if(i==1) for(j=1;j<k;j++) f[j]=1;
		else{Mc(g,f);Me(f,0);ll Ts=0;for(j=0;j<=m;j++) Ts+=g[j],j>k-1&&(Ts-=g[j-k]),f[j]=Ts%mod;}
		for(j=m;j>0;j-=k-1) if(i*(k-1)+1-j<=n)ToT+=f[j];
	}printf("%lld\n",ToT%mod);
}
posted @   275307894a  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
历史上的今天:
2021-08-14 luogu P3296 [SDOI2013]刺客信条
浏览器标题切换
浏览器标题切换end
点击右上角即可分享
微信分享提示