当前位置: 首页 > news >正文

cf954H

挖我自闭了这是什么东西啊。

给出一棵深度为  n 的树,其中深度为  i 的节点有  a_i 个儿子。问树上的简单路径中长度在  1\sim2n-2 之间的每个有多少条。

f_{i,j} 表示对于在 i 层的 1 个节点,向下走 j 步的方案数

g_{i,j} 表示对于在 i 层的 1 个节点,向上走 j 步的方案数

然后我们可以得到这样的递推式。

 f[i][j]=a[i]*f[i+1][j-1]);
g[i][j]=(j>=2)*(a[i-1]-1)*f[i][j-2]+g[i-1][j-1]);
显然对于一条路径会算两次。所以最终答案除以 2
 即可。
你以为这就完了?
下面才是自闭的开始。
256M大概能开6e7?记不清了。。。所以我们只能开一个[5000][9999]这样纸的数组,然后滚来滚去滚来滚去。
ac代码:
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int mod = 1e9+7;
 5 int n;
 6 int a[5001],c[5005];
 7 int f[5001][9999],ans[9999];
 8 int main(){
 9     ios::sync_with_stdio(false);
10     cin>>n;c[0]=1;
11     for(int i=1;i<n;i++)cin>>a[i];
12     for(int i=1;i<=n;i++)c[i]=1ll*a[i]*c[i-1]%mod;
13     for(int i=n;i>=1;i--){
14         f[i][0]=1;
15         for(int j=1;j<=n-i;j++){
16             f[i][j]=(1ll*a[i]*f[i+1][j-1])%mod;
17             ans[j]=(1ll*f[i][j]*c[i-1]+ans[j])%mod;
18         }
19     }
20     for(int i=1;i<=n;i++){
21         for(int j=2*n-2;j>=1;j--){
22             f[i][j]=f[i-1][j-1];
23             if(i>1&&j>1)
24                 f[i][j]=(1ll*(a[i-1]-1)*f[i][j-2]+f[i][j])%mod;
25             ans[j]=(1ll*f[i][j]*c[i-1]+ans[j])%mod;
26         }
27     }
28     for(int i=1;i<=2*n-2;i++){
29         cout<<(mod+1ll)*ans[i]/2%mod<<' ';
30     }
31 }
View Code

MLE ON TEST 01 代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int mod = 1e9+7;
 5 int n;
 6 int a[5001];
 7 int f[5001][5001],g[5001][9999];
 8 int main(){
 9     ios::sync_with_stdio(false);
10     cin>>n;a[0]=1;
11     for(int i=1;i<n;i++)cin>>a[i];
12     for(int i=1;i<=n;i++)
13        f[i][1]=a[i],f[i][0]=1;
14     for(int i=2;i<=n;i++)
15         g[i][1]=1,g[i][0]=1;
16     for(int i=n-1;i>=1;i--){
17         for(int j=2;j<=n-i;j++){
18             f[i][j]=(1ll*a[i]*f[i+1][j-1])%mod;
19         }
20     }
21     for(int i=2;i<=n;i++){
22         for(int j=2;j<=2*n-2;j++){
23             g[i][j]=(1ll*(j>=2)*(a[i-1]-1)*f[i][j-2]+g[i-1][j-1])%mod;
24         }
25     }
26     for(int i=1;i<=n;i++)a[i]=1ll*a[i]*a[i-1]%mod;
27     for(int i=1;i<=2*n-2;i++){
28         ll sum = 0;
29         for(int j=1;j<=n;j++){
30             sum=(sum+1ll*a[j-1]*(f[j][i]+g[j][i])%mod)%mod;
31         }
32         cout<<sum/2<<' ';
33     }
34 }
View Code

 

 

转载于:https://www.cnblogs.com/MXang/p/10220686.html

相关文章:

  • ajax跨域请求,亲测有效
  • 关于重置功能(type=reset)的相关问题
  • Linux启动流程与模块管理(15)
  • php封装的mysqli类完整实例
  • CDN学习笔记
  • syntax error near unexpected token '$'\r''
  • css中定位功能的特性
  • linux系统shell基础知识入门
  • 雷林鹏分享:Ruby 方法
  • 面向对象学生类的定义和学生类的使用
  • 创建AOP代理(中篇)
  • 001:特殊密码锁
  • Python定时任务 Celery+Redis
  • Matplotlib添加图例操作
  • 2019-1-10 日记
  • 2017-08-04 前端日报
  • 30天自制操作系统-2
  • Android交互
  • download使用浅析
  • jquery ajax学习笔记
  • js递归,无限分级树形折叠菜单
  • Spring Boot快速入门(一):Hello Spring Boot
  • webpack+react项目初体验——记录我的webpack环境配置
  • 大快搜索数据爬虫技术实例安装教学篇
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 突破自己的技术思维
  • elasticsearch-head插件安装
  • HanLP分词命名实体提取详解
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • #图像处理
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (二)WCF的Binding模型
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (原)Matlab的svmtrain和svmclassify
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)linux 命令大全
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • (转)人的集合论——移山之道
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .net refrector
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NET框架
  • .NET中两种OCR方式对比
  • @AliasFor注解
  • @AutoConfigurationPackage的使用
  • @Validated和@Valid校验参数区别
  • [ vulhub漏洞复现篇 ] ThinkPHP 5.0.23-Rce
  • [Bada开发]初步入口函数介绍