您的位置:首页 > 其它

1089: [SCOI2003]严格n元树 DP+高精度

2016-03-16 07:44 309 查看
可以发现对于一棵深度为nn的树,这棵树除深度为nn的那棵子树外其它子树的高度可以是0..n0..n,所以如果用fif_i表示深度为ii的树的个数可能不太好转移,我们考虑前缀和的形式,令sis_i表示深度≤i\leq i的树的个数。

那么一棵深度为nn的树其实就是根节点加nn个深度<=n−1<=n-1的树,所以有si=sni−1+1s_i=s_{i-1}^n+1,然后我们就可以高精度搞一搞了。

重载运算符大法好

[code]#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: