嘟嘟嘟

这题自己搞了个dp,然后卡空间一上午终于过了……

令\(dp[i][j]\)表示深度为\(i\),这一层有\(n * j\)个节点的\(n\)元树的个数。然后我们枚举上一层的节点个数进行转移:\[dp[i][j] = \sum _ {k = 1} ^ {n ^ {i - 2}}dp[i - 1][k] * C_{nk} ^ {j}\]
然后因为出题人要恶心人没有取模,所以要写高精。
写完后自信满满一交MLE了,发现只有128MB……于是开始卡空间……
首先把dp变成滚动数组,但还是超时。这时候想到了压位高精,于是把每8位压成1位,然后高精数组长度改成\(\frac{200}{8} + 1 = 26\),这样就过了……多开一点就会MLE。

其实我这不是最简单的写法,最简单的写法是令\(dp[i]\)表示深度不超过\(i\)的\(n\)元树的个数,这样答案就是\(dp[d] - dp[d - 1]\)。转移的时候考虑新添加一个根连向\(i - 1\)的所有树根,于是有\(dp[i] = dp[i - 1] ^ n + 1\),\(+1\)是因为没有儿子节点的情况。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<vector>
#include<stack>
#include<queue>
#include<assert.h>
using namespace std;
#define enter puts("")
#define space putchar(' ')
#define Mem(a, x) memset(a, x, sizeof(a))
#define In inline
typedef long long ll;
typedef double db;
const int INF = 0x3f3f3f3f;
const db eps = 1e-8;
const int maxn = 35;
const int N = 1024;
In ll read()
{ll ans = 0;char ch = getchar(), last = ' ';while(!isdigit(ch)) last = ch, ch = getchar();while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar();if(last == '-') ans = -ans;return ans;
}
In void write(ll x)
{if(x < 0) x = -x, putchar('-');if(x >= 10) write(x / 10);putchar(x % 10 + '0');
}
In void MYFILE()
{
#ifndef mrclrfreopen("ha.in", "r", stdin);freopen("ha.out", "w", stdout);
#endif
}int n, d;
const int maxN = 26;
const int M = 100000000;
const int P = 8;
struct Big
{int a[maxN], len;In void N() {a[0] = len = 1;}friend In Big operator + (const Big& A, const Big& B){Big ret; int Len = min(maxN - 1, max(A.len, B.len));if(Len == maxN - 1) {ret.a[0] = 0, ret.len = 1; return ret;}Mem(ret.a, 0);for(int i = 0; i < Len; ++i){ret.a[i] += A.a[i] + B.a[i];ret.a[i + 1] = ret.a[i] / M, ret.a[i] %= M;}if(Len < maxN - 1 && ret.a[Len]) ++Len;while(Len > 1 && !ret.a[Len - 1]) --Len;ret.len = Len;return ret;}friend In Big operator * (const Big& A, const Big& B){Big ret;ret.len = min(maxN - 1, A.len + B.len - 1);if(ret.len == maxN - 1) {ret.a[0] = 0, ret.len = 1; return ret;}Mem(ret.a, 0);for(int i = 0; i < A.len; ++i)for(int j = 0; j < B.len; ++j){ll tp = 1LL * A.a[i] * B.a[j];if(i + j < maxN) ret.a[i + j] += tp % M;if(i + j + 1 < maxN) ret.a[i + j + 1] += tp / M;}if(ret.len < maxN - 1 && ret.a[ret.len]) ++ret.len;while(ret.len > 1 && !ret.a[ret.len - 1]) --ret.len;return ret;}In void out(){write(a[len - 1]);for(int i = len - 2; i >= 0; --i) printf("%0*d", P, a[i]);}
}C[N + 2][N + 2], dp[2][N + 2];ll Pow[N + 2];
In void init()
{for(int i = 0; i <= N; ++i)for(int j = 0; j <= N; ++j) C[i][j].a[0] = 0, C[i][j].len = 1;C[0][0].N();for(int i = 1; i <= N; ++i){C[i][0].N();for(int j = 1; j <= i; ++j) C[i][j] = C[i - 1][j] + C[i - 1][j - 1];}Pow[0] = 1;for(int i = 1; i <= N; ++i) Pow[i] = Pow[i - 1] * n;
}int main()
{MYFILE();n = read(), d = read();if(!d) {puts("1"); return 0;}init();dp[0][1].N(), dp[1][1].N();int o = 0;for(int i = 2; i <= d; ++i, o ^= 1){for(int j = 1; j <= Pow[i - 1]; ++j){Mem(dp[o][j].a, 0); dp[o][j].len = 1;for(int k = 1; k <= Pow[i - 2]; ++k)dp[o][j] = dp[o][j] + (dp[o ^ 1][k] * C[n * k][j]);}}Big ans; Mem(ans.a, 0), ans.len = 1;for(int i = 1; i <= Pow[d - 1]; ++i) ans = ans + dp[o ^ 1][i];ans.out(), enter;return 0;
}

转载于:https://www.cnblogs.com/mrclr/p/10963045.html

[SCOI2003]严格N元树相关推荐

  1. bzoj1089 [SCOI2003]严格n元树(dp+高精)

    1089: [SCOI2003]严格n元树 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 1899  Solved: 954 [Submit][Sta ...

  2. 简单高精度模板(bzoj 1089: [SCOI2003]严格n元树)

    1089: [SCOI2003]严格n元树 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 1831  Solved: 913 [Submit][Sta ...

  3. 1089: [SCOI2003]严格n元树

    好久没更新了..于是节操掉尽python水过本来就水的题.. 1 n,d=map(int, raw_input().split()) 2 if d==0: 3 print 1 4 else: 5 f= ...

  4. bzoj1089: [SCOI2003]严格n元树

    这题方程就是f(i)=f(i-1)^n+1 高精度谢谢. #include<cstdio> #include<iostream> #include<cstring> ...

  5. 2019.4.summary

    2019.4.1 BZOJ1061: [Noi2008]志愿者招募 真心有点难QAQ https://www.byvoid.com/zhs/blog/noi-2008-employee 看void爷的 ...

  6. [颓废史]蒟蒻的刷题记录

    QAQ蒟蒻一枚,其实我就是来提供水题库的. 以下记录从2016年开始. 1.1 1227: [SDOI2009]虔诚的墓主人 树状数组+离散化 3132: 上帝造题的七分钟 树状数组 二维区间加减+查 ...

  7. composer 检查镜像_检查N元树中的镜像

    composer 检查镜像 Problem statement: 问题陈述: Given two n-ary trees, the task is to check if they are mirro ...

  8. 认真学习数据结构之树

    树形结构是一种层级式的数据结构,由顶点(节点)和连接它们的边组成. 树类似于图,但区分树和图的重要特征是树中不存在环路. 常见的树的类型有:N元树.平衡树.二叉树.二叉搜索树.AVL树.红黑树.2-3 ...

  9. java中的数据结构——树

    树 树形结构是一种层级式的数据结构,由节点和连接它们的边组成, java语言编写的程序中常常用引用来表示边.根是树中顶端的节 点:它没有父节点.节点表示保存在树中的数据对象.非平衡树是 指根左边的后代 ...

  10. 离散数学与组合数学-05树

    文章目录 离散数学与组合数学-05树 5.1 认识树 5.1.1 树的模型 5.1.2 树的应用 5.2 无向树 5.2.1 定义 5.2.2 树的性质 5.2.3 性质应用 5.3 生成树 5.3. ...

最新文章

  1. linux查看nginx并发连接情况
  2. unity快速接入第三方sdk_直播美颜SDK实现需要具备哪些条件
  3. 湖北宜昌:老太不慎落入江中 小伙奋勇救人
  4. 图片裁切,上传,自动匹配颜色。
  5. java医疗框架,java毕业设计_springboot框架的城市智慧医疗服务系统
  6. 汇编语言 用push指令将a段中的前8个字形数据,逆序存储到b段中
  7. 我对计算机感兴趣作文300字,我想对电脑游戏说作文300字
  8. Centos7下配置安装mysql5.5主从复制(一主两从)
  9. 福利网站!程序员面试——算法工程师面试大全第一部分
  10. 晶振两端的谐振电容有特殊要求吗_“吃瓜群众”也能秒懂的晶振电路原理
  11. TCP和UDP协议的特点和区别详解
  12. XPath 基本语法
  13. CISCO 路由器启动自动配置
  14. 鱼骨图和甘特图图表合集PPT模板
  15. ftp主动模式与被动模式
  16. Golang优秀开源项目汇总
  17. 读《从优秀到卓越》乱摘
  18. 手机如何与运营商服务器,通过这样的操作,让你的手机网速瞬间提升。
  19. 雷军语录:写程序有写诗一样的感觉
  20. 如何将阿里图标库的引入项目中?

热门文章

  1. 日本惠普发表14.1型液晶内藏笔记本PC「dv4」系列2种模式
  2. 网络工程师HCIE-RS-路由回馈问题(通俗易懂!)
  3. 基于Cocos2d-x开发guardCarrot--3 《保卫萝卜2》主页面开发(仅使用Cocos2d-x)
  4. NYOJ--4--ASCII码排序
  5. 如何实现一个简单的熔断以及Hystrix原理分析
  6. 中国老工业基地吉林对外贸易重回历史高水平
  7. JavaScript中函数的上下文——this
  8. BCB使用线程删除目录中的图片
  9. 《程序员修炼之道》---- 修的是什么
  10. 手把手玩转win8开发系列课程(20)