bzoj1089严格n元树——DP+高精度
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1089
f[d]为深度小于等于d的树的个数;
从根节点出发,有n个子树,乘法原理可以得到 f[d] = f[d-1] ^ n + 1 ,加1是因为也可以没有根节点;
需要高精度,直接重载运算符十分方便。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int const rad=;
int n,d;
struct data{
int v[],l;
}f[];
data operator*(data a,data b)
{
data c;
for(int i=;i<=a.l+b.l;i++)c.v[i]=;
for(int i=;i<=a.l;i++)
for(int j=;j<=b.l;j++)
c.v[i+j-]+=a.v[i]*b.v[j];
c.l=a.l+b.l;
for(int i=;i<=c.l;i++)
{
if(c.v[i]>=rad)
{
if(i==c.l)
{
c.l++;
c.v[c.l]=c.v[i]/rad;
}
else c.v[i+]+=c.v[i]/rad;
c.v[i]%=rad;
}
}
while(c.v[c.l]==&&c.l>)c.l--;
return c;
}
data operator^(data a,int n)
{
data c;
c.l=;c.v[]=;
while(n)
{
if(n&)c=c*a;
a=a*a;
n>>=;
}
return c;
}
data operator+(data a,int x)
{
a.v[]+=x;
int now=;
while(a.v[now]>=rad)a.v[now+]+=a.v[now]/rad,a.v[now]%=rad,now++;
a.l=max(a.l,now);
return a;
}
data operator-(data a,data b)
{
for(int i=;i<=a.l;i++)
{
a.v[i]-=b.v[i];
if(a.v[i]<)
{
a.v[i]+=rad;
a.v[i+]--;
}
}
while(a.v[a.l]==&&a.l>)a.l--;
return a;
}
//void print(data a)
//{
// for(int i=a.l;i;i--)
// printf("%d",a.v[i]);
//}
void print(data a)
{
printf("%d",a.v[a.l]);
for(int i=a.l-;i;i--)
printf("%03d",a.v[i]);
printf("\n");
}
int main()
{
scanf("%d%d",&n,&d);
if(d==)
{
printf("");return ;
}
f[].l=;f[].v[]=;
for(int i=;i<=d;i++)
f[i]=(f[i-]^n)+;//+ 必须加括号!!!
print(f[d]-f[d-]);
return ;
}
bzoj1089严格n元树——DP+高精度的更多相关文章
- BZOJ1089:[SCOI2003]严格n元树(DP,高精度)
Description 如果一棵树的所有非叶节点都恰好有n个儿子,那么我们称它为严格n元树.如果该树中最底层的节点深度为d (根的深度为0),那么我们称它为一棵深度为d的严格n元树.例如,深度为2的严 ...
- 【BZOJ1089】[SCOI2003]严格n元树(高精度,动态规划)
[BZOJ1089][SCOI2003]严格n元树(高精度,动态规划) 题面 BZOJ 洛谷 题解 设\(f[i]\)表示深度为\(i\)的\(n\)元树个数.然后我们每次加入一个根节点,然后枚举它的 ...
- bzoj1089 [SCOI2003]严格n元树(dp+高精)
1089: [SCOI2003]严格n元树 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1899 Solved: 954[Submit][Statu ...
- BZOJ 1089 SCOI2003 严格n元树 动态规划+高精度
题目大意:定义一棵深度为d的严格n元树为根的深度为0,最深的节点深度为d,且每一个非叶节点都有恰好n个子节点的树 给定n和d,求深度为d的严格n元树一共同拥有多少种 此题的递推部分并不难 首先我们设深 ...
- P4295 [SCOI2003]严格N元树 DP
思路:DP 提交:\(5\)次 错因:2次高精写错(我太菜了),2次写错特判 题解: 设\(f[i]\)表示深度\(\leq i\)的严格\(n\)元树的数目,有 \[f[i]=pow(f[i-1], ...
- [bzoj1089]严格n元树
设f[i]表示深度不超过i的方案数,那么有f[0]=1,$f[i]=f[i-1]^{n}+1$,然后用高精度即可(注意深度恰好为d还要用f[d]-f[d-1]才是答案) 1 #include<b ...
- bzoj1089严格n元树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1089 这是一种套路:记录“深度为 i ”的话,转移需要讨论许多情况:所以可以记录成“深度&l ...
- bzoj 1089 [SCOI2003]严格n元树(DP+高精度)
1089: [SCOI2003]严格n元树 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1250 Solved: 621[Submit][Statu ...
- [BZOJ1089][SCOI2003]严格n元树(递推+高精度)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1089 分析: 第一感觉可以用一个通式求出来,但是考虑一下很麻烦,不好搞的.很容易发现最 ...
随机推荐
- spring工具类获取bean
import org.springframework.web.context.ContextLoader; import org.springframework.web.context.WebAppl ...
- chrome 的onbeforeunload事件没有触发
onbeforeunload event is not working when user not click inside the body of page 0down votefavorite ...
- 源码编译安装php
原文:https://klionsec.github.io/2017/11/23/phpsec/#menu After compile install php 5.3.1, I can not fin ...
- linux 状态与系统调优
什么样的cup 才算是负载高呢?才算忙呢?
- Monkey源代码分析之事件注入
本系列的上一篇文章<Monkey源代码分析之事件源>中我们描写叙述了monkey是怎么从事件源取得命令.然后将命令转换成事件放到事件队列里面的.可是到如今位置我们还没有了解monkey里面 ...
- Linux C++的多线程编程(转)
1. 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的Unix也支持线程的概念,但是在一个进程(proces ...
- POJ - 1062 昂贵的聘礼(最短路Dijkstra)
昂贵的聘礼 Time Limit: 1000MS Memory Limit: 10000KB 64bit IO Format: %I64d & %I64u SubmitStatus Descr ...
- Effective C++ 43,44
43.明智地使用多继承. 多继承带来了极大的复杂性.最主要的一条就是二义性. 当派生类为多继承时,其多个基类有同名的成员时,就会出现二义性.通常要明白其使用哪个成员的.显式地限制修饰成员不仅非常笨拙, ...
- 通过/proc/cpuinfo判断CPU数量、Multicores、Multithreading、Hyper-threading
http://blog.sina.com.cn/s/blog_4a6151550100iowl.html 判断依据:1.具有相同core id的cpu是同一个core的超线程.2.具有相同physic ...
- 第8章4节《MonkeyRunner源代码剖析》MonkeyRunner启动执行过程-启动AndroidDebugBridge
上一节我们看到在启动AndroidDebugBridge的过程中会调用其start方法,而该方法会做2个基本的事情: 715行startAdb:开启AndroidDebugBridge 722-723 ...