Hướng dẫn giải của Bread Tree


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

Lưu ý: Các code mẫu dưới đây chỉ mang tính tham khảo và có thể không AC được bài tập này

Code mẫu của flashmt

const fi='';
      fo='';
      max=1234567890;
var n,k:int64;
    a:array[1..30,1..45] of int64;
    num:array[2..30] of longint;
    b:array[2..30] of int64;

procedure init;
var i,j:longint;
begin
     a[1,1]:=1; a[1,2]:=3;
     for i:=2 to 30 do
     begin
          a[i,i+1]:=0;
          for j:=1 to i do
          begin
               a[i,j]:=a[i-1,j];
               a[i,i+1]:=a[i,i+1]+a[i,j];
          end;
          a[i,i+1]:=a[i,i+1]+i+1; inc(j);
          while a[i,j]<=max do
          begin
               inc(j);
               a[i,j]:=a[i,j-1]*2-a[i,j-i-1]+1;
          end;
          num[i]:=j; b[i]:=a[i,j];
     end;
end;

begin
     init;
     assign(input,fi); reset(input);
     assign(output,fo); rewrite(output);
     readln(n,k);
     while n<>0 do
     begin
          dec(n);
          if n=0 then writeln(0)
          else
          begin
          if k=0 then
          begin
               if n>max+1 then n:=max+1;
               writeln(n);
          end
          else
          begin
               if k=1 then
               begin
                    if n>49690 then n:=49690;
                    writeln(n*(n+1) div 2);
               end
               else
               begin
                    if (n>=31) and (k>=30) then writeln(a[30,31])
                    else
                    begin
                         if k>=30 then writeln(a[n-1,n])
                         else
                         begin
                              if n>num[k] then writeln(b[k])
                              else writeln(a[k,n]);
                         end;
                    end;
               end;
          end;
          end;
          readln(n,k);
     end;
     close(input); close(output);
end.

Code mẫu của RR

{$R+,Q+}
uses math;
const
  gh=1234567890;

var
  n,k:int64;
  f:array[0..1,0..50] of int64;

procedure solve;
    var
      t,i,now:longint;
      sum:int64;
    begin
      fillchar(f,sizeof(f),0);
      f[1,0]:=1;
      now:=0; sum:=0;
      for t:=2 to n do
        begin
          fillchar(f[now],sizeof(f[now]),0);
          sum:=0;
          for i:=0 to t do
            begin
              if i>0 then f[now,i]:=f[1-now,i-1];
              if i<k then inc(f[now,0],f[1-now,i]);
            end;

          for i:=0 to t do
            inc(sum,f[now,i]*i);

          if sum>gh then begin writeln(sum); exit; end;
          now:=1-now;
        end;
      writeln(sum);
    end;

begin
  read(n,k);
  while (n>0) do
    begin
      if k=0 then writeln(min(n-1,gh+1))
      else if k=1 then
        begin
          if n>49691 then n:=49691;
          writeln(((n-1)*int64(n)) shr 1)
        end
      else solve;
      read(n,k);
    end;
end.

Code mẫu của hieult

#include <stdio.h>
//#include <conio.h>

main()
{
      //freopen("BRTREE.in","r",stdin);
      long long n,k,a[1000],max=1234567890,KQ,lon=49690;
      while(scanf("%lld %lld",&n,&k)>0 && n>0)
      {
           if(k==0)
           {
               if(n-1>=max+1)
                  printf("%lld\n",max+1);
               else printf("%lld\n",n-1);
           }
           else if(k==1)
           {

               if(n>lon)
               {
                   //printf("%lld\n",n*(n-1)/2);
                   printf("%lld\n",lon*(lon+1)/2);
               }
               else printf("%lld\n",n*(n-1)/2);
           }
           else 
           {

                a[1]=0;KQ=0;
                for(int i=2;i<=n;i++)
                {
                    a[i]=i-1;
                    for(int j=i-1;j>=i-k;j--)
                    {
                        if(j==0)
                            break;
                        else a[i]=a[i]+a[j];
                    }
                    if(a[i]>max)
                    {
                        KQ=a[i];
                        break;
                    }
                    if(i==n)
                        KQ=a[i];
                }
                printf("%lld\n",KQ);
           }
      }
     // getch();
}

Code mẫu của khuc_tuan

uses math, sysutils;

var
    res, n, k : int64;
    f : array[1..100] of int64;
    i, j : longint;

begin
    while true do
    begin
        readln(n,k);
        if n=0 then break;
        if n=1 then writeln(0)
        else if k=0 then writeln(min(n-1,1234567891))
        else if k=1 then
        begin
            if n > 10000000 then writeln(1234572895)
            else writeln(min(1234572895, n * (n-1) div 2));
        end
        else
        begin
            res := 0;
            f[1] := 1;
            i := 1;
            while true do
            begin
                res := res + f[i];
                if res > 1234567890 then break;
                if (i+1) = n then break;
                f[i+1] := 1;
                for j:=i downto max(1,i-k+1) do
                    f[i+1] := f[i+1] + f[j];
                inc(i);
            end;
            writeln(res);
        end;
    end;
end.

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.