可以发现对于一棵深度为
n
的树,这棵树除深度为
那么一棵深度为
n
的树其实就是根节点加
重载运算符大法好
#include<iostream>
#include<cstdio>
#define base 10000
using namespace std;
int n,d;
struct node
{
int num[305];
int cnt;
void operator=(int y)
{
num[1]=y;
cnt=1;
}
int& operator[](int x)
{
return num[x];
}
}s[20];
inline int read()
{
int a=0,f=1; char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();}
while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();}
return a*f;
}
node operator*(node a,node b)
{
node ans=s[19];
for (int i=1;i<=a.cnt;i++)
for (int j=1;j<=b.cnt;j++)
{
ans[i+j-1]+=a[i]*b[j];
ans[i+j]+=ans[i+j-1]/base;
ans[i+j-1]%=base;
}
ans.cnt=a.cnt+b.cnt;
if (!ans[ans.cnt]) ans.cnt--;
return ans;
}
node operator^(node a,int b)
{
node ans=s[19]; ans=1;
for (;b;b>>=1,a=a*a)
if (b&1) ans=ans*a;
return ans;
}
void operator++(node &a)
{
int now=1; a[1]++;
while (a[now]==10000)
a[now]=0,a[++now]++;
}
node operator-(node a,node b)
{
node ans=s[19];
for (int i=1;i<=a.cnt;i++)
{
ans[i]+=a[i]-b[i];
if (ans[i]<0)
ans[i]+=base,ans[i+1]--;
if (ans[i])
ans.cnt=i;
}
return ans;
}
void print(node ans)
{
printf("%d",ans[ans.cnt]);
for (int i=ans.cnt-1;i;i--)
{
if (ans[i]<1000) printf("0");
if (ans[i]<100) printf("0");
if (ans[i]<10) printf("0");
printf("%d",ans[i]);
}
}
int main()
{
n=read(); d=read();
if (!d)
{
puts("1");
return 0;
}
s[0]=1;
for (int i=1;i<=d;i++)
s[i]=s[i-1]^n,++s[i];
node ans=s[d]-s[d-1];
print(ans);
return 0;
}