AT2294 [AGC009E] Eternal Average
考虑求值的过程,容易发现我们会形成一颗叉树,然后最后的总和是每个点对应的深度的次幂和。
容易发现在同一层有个同样的点可以用下一层个点代替并删除上面个点,因此我们只要对任意的点对计数有层,最上面一层有个,以后每层个,的个数和为,并且最上面一层不能同为一个数的方案数。容易dp转移,时间复杂度。注意到外围的循环是级别的,因此内层暴力转移复杂度也是对的。
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);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
2021-08-14 luogu P3296 [SDOI2013]刺客信条