zoukankan      html  css  js  c++  java
  • bzoj 1089 SCOI2003严格n元树 递推

    挺好想的,就是一直没调过,我也不知道哪儿的错,对拍也拍了,因为数据范围小,都快手动对拍了也不知道

    哪儿错了。。。。

    我们定义w[i]代表深度<=i的严格n元树的个数

    那么最后w[d]-w[d-1]就是答案

    那么对于w[i],我们由w[i-1]递推来,

    我们考虑新加一个根节点,然后根节点有n个子节点,每个子节点都可以建一颗深度<=i-1的树,那么每个

    子节点都有w[i-1]种选法,那么n个子节点就有w[i-1]^n选法,再加上都不选,就是深度为0的情况

    那么w[i]:=(w[i-1]^n)+1;

    //By BLADEVIL
    var
        w                           :array[-1..100] of ansistring;
        n, d                        :longint;
        a, b, c                     :array[0..100000] of int64;
     
    function mul(s1,s2:ansistring):ansistring;
    var
        i, j                        :longint;
        len1, len2                  :longint;
        s                           :ansistring;
    begin
        len1:=length(s1);
        len2:=length(s2);
        fillchar(c,sizeof(c),0);
        fillchar(a,sizeof(a),0);
        fillchar(b,sizeof(b),0);
        for i:=1 to len1 do a[(len1-i) div 4+1]:=a[(len1-i) div 4+1]*10+ord(s1[i])-48;
        for i:=1 to len2 do b[(len2-i) div 4+1]:=b[(len2-i) div 4+1]*10+ord(s2[i])-48;
        len1:=(len1+3) div 4;
        len2:=(len2+3) div 4;
        for i:=1 to len1 do
            for j:=1 to len2 do
            begin
                c[i+j-1]:=c[i+j-1]+a[i]*b[j];
                c[i+j]:=c[i+j]+c[i+j-1] div 10000;
                c[i+j-1]:=c[i+j-1] mod 10000;
            end;
        mul:='';
        len1:=len1+len2+1;
        for i:=len1 downto 1 do
        begin
            if c[i]<1000 then mul:=mul+'0';
            if c[i]<100 then mul:=mul+'0';
            if c[i]<10 then mul:=mul+'0';
            str(c[i],s);
            mul:=mul+s;
        end;
        while (mul[1]='0') and (length(mul)>1) do delete(mul,1,1);
    end;
     
    function mi(x:ansistring):ansistring;
    var
        p                           :longint;
        ans, sum                    :ansistring;
    begin
        ans:='1';
        sum:=x;
        p:=n;
        while p<>0 do
        begin
            if p mod 2=1 then ans:=mul(ans,sum);
            p:=p div 2;
            sum:=mul(sum,sum);
        end;
        mi:=ans;
    end;
         
    function inc(x:ansistring):ansistring;
    var
        len                         :longint;
        i                           :longint;
        s                           :ansistring;
         
    begin
        len:=length(x);
        for i:=1 to len do c[i]:=ord(x[i])-48;
        c[len]:=c[len]+1;
        for i:=len downto 1 do
        begin
            c[i-1]:=c[i-1]+c[i] div 10;
            c[i]:=c[i] mod 10;
        end;
        inc:='';
        len:=len;
        for i:=0 to len do
        begin
            str(c[i],s);
            inc:=inc+s;
        end;
        while (inc[1]='0') and (length(inc)>1) do delete(inc,1,1);
    end;
         
    function jian(s1,s2:ansistring):ansistring;
    var
        i                           :longint;
        len1, len2                  :longint;
        s                           :ansistring;
    begin
        len1:=length(s1);
        len2:=length(s2);
        fillchar(c,sizeof(c),0);
        for i:=1 to len1 do a[len1-i+1]:=ord(s1[i])-48;
        for i:=1 to len2 do b[len2-i+1]:=ord(s2[i])-48;
        for i:=1 to len1 do c[i]:=a[i]-b[i];
        for i:=1 to len1 do
            if c[i]<0 then
            begin
                c[i]:=c[i]+10;
                c[i+1]:=c[i+1]-1;
            end;
        jian:='';
        for i:=len1 downto 1 do
        begin
            str(c[i],s);
            jian:=jian+s;
        end;
        while (jian[1]='0') and (length(jian)>1) do delete(jian,1,1);
    end;
         
    procedure main;
    var
        i                           :longint;
    begin
        readln(n,d);
        if d=0 then 
        begin
            writeln(1);
            exit;
        end;
        w[0]:='1';
        for i:=1 to d do w[i]:=inc(mi(w[i-1]));
        writeln(jian(w[d],w[d-1]));
    end;
        
    begin
        main;
    end.
  • 相关阅读:
    了解外界的窗口
    博客添加卡通精灵
    LINUX chage 命令 以及常用参数
    Linux系统 端口知识以及相关监听工具
    Linux 常用命令之cp
    树莓派的知识分享
    ghost一键备份还原工具使用指南
    使用rsync在Windows(服务端)与Linux (客户端)之间的同步
    制作linux 随身碟
    白嫖!1000+个常用的Linux命令!
  • 原文地址:https://www.cnblogs.com/BLADEVIL/p/3465256.html
Copyright © 2011-2022 走看看