Hướng dẫn giải của 0 0 Pairs


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='';
      maxn=1000;
      base=1000000000;
      digit=9;
type bignum=array[0..40] of longint;
var a,b:array[0..maxn] of bignum;
    t,i,l,j,num,k:longint;
    c:array[1..10000] of longint;
    s:string;

procedure double(k:integer);
var i:integer;  mem:byte;
begin
     b[k,0]:=b[k-1,0];
     mem:=0;
     for i:=1 to b[k,0] do
     begin
          b[k,i]:=b[k-1,i]+b[k-1,i]+mem;
          if b[k,i]<base then mem:=0
          else
          begin
               b[k,i]:=b[k,i]-base; mem:=1;
          end;
     end;
     if mem>0 then
     begin
          inc(b[k,0]);
          b[k,b[k,0]]:=mem;
     end;
end;

procedure plus(k:integer);
var i:integer; mem:byte;
begin
     if a[k-2,0]<=b[k-2,0] then a[k,0]:=b[k-2,0]
     else a[k,0]:=a[k-2,0];
     mem:=0;
     for i:=1 to a[k,0] do
     begin
          a[k,i]:=a[k-2,i]+b[k-2,i]+mem;
          if a[k,i]<base then mem:=0
          else
          begin
               a[k,i]:=a[k,i]-base; mem:=1;
          end;
     end;
     if mem>0 then
     begin
          inc(a[k,0]);
          a[k,a[k,0]]:=mem;
     end;
end;

procedure init;
var i:integer;
begin
     b[0,0]:=1; b[1,0]:=1; b[0,1]:=1; b[1,1]:=1;
     a[1,0]:=1;
     for i:=2 to j do
     begin
          double(i);
          plus(i);
     end;
end;

begin
     assign(input,fi);
     reset(input);
     assign(output,fo);
     rewrite(output);
     i:=0; j:=0;
     while not eof(input) do
     begin
          inc(i);
          readln(c[i]);
          if c[i]>j then j:=c[i];
     end;
     num:=i;
     init;
     for k:=1 to num do
     begin
          t:=c[k];
          for i:=a[t,0] downto 1 do
          begin
               if i<a[t,0] then
               begin
                    str(a[t,i],s);
                    l:=length(s);
                    for j:=l+1 to digit do write(0);
               end;
               write(a[t,i]);
          end;
          writeln;
     end;
     close(output);
     close(input);
end.

Code mẫu của happyboy99x

#include<cstdio>

const int N = 1000, BASE = 1000000000, LOG_BASE = 9, N_DIGIT = 34;
struct BigInteger {
    int d[N_DIGIT], n;

    void operator ++ () {
        for(int i = 0; i < n; ++i)
            if(++d[i] == BASE) d[i] = 0;
            else return;
        d[n++] = 1;
    }

    void operator += (const BigInteger &a) {
        if(a.n > n) n = a.n;
        int rem = 0;
        for(int i = 0; i < n; ++i) {
            int p = d[i] + a.d[i] + rem;
            if(p >= BASE) d[i] = p - BASE, rem = 1;
            else d[i] = p, rem = 0;
        }
        if(rem) d[n++] = rem;
    }

    void print() {
        printf("%d", d[n-1]);
        for(int i = n-2; i >= 0; --i)
            printf("%0*d", LOG_BASE, d[i]);
        printf("\n");
    }
} cOne[N+1], cZero[N+1];

int main() {
    for(int i = 1; i <= N; ++i) {
        cOne[i] = cOne[i-1];
        cOne[i] += cZero[i-1];
        cZero[i] = cOne[i];
        if(i % 2 == 0) ++cZero[i];
    }
    for(int n; scanf("%d", &n) == 1; cZero[n].print());
    return 0;
}

Code mẫu của ladpro98

program m00pair;
uses    math;
type    big=ansistring;
const   maxn=1001;
        fi='';
var     f:array[1..maxn] of big;
        n,i:longint;
        inp:text;

function sum(a,b:big):big;
var     x,y,s,carry,i:longint;
        c:big;

begin
        if length(a)<length(b) then c:=b
        else
        c:=a;
        carry:=0;
        while length(a)<length(b) do a:='0'+a;
        while length(b)<length(a) do b:='0'+b;
        for i:=length(a) downto 1 do
        begin
                x:=ord(a[i])-48;
                y:=ord(b[i])-48;
                s:=x+y+carry;
                carry:=s div 10;
                c[i]:=chr(s mod 10 + 48);
        end;
        if carry>0 then c:='1'+c;
        exit(c);
end;

procedure dp(i:longint);
var     j:longint;
begin
        if i>n then
        begin
                for j:=n+1 to i do
                f[j]:=sum(f[j-1],sum(f[j-2],f[j-2]));
                n:=i;
        end;

end;

begin
        assign(inp,fi);
        reset(inp);
        f[1]:='0';f[2]:='1';n:=2;
        while not eof(inp) do
        begin
                readln(inp,i);
                dp(i);
                writeln(f[i]);

        end;
        close(inp);
end.

Code mẫu của RR

{$R+,Q+}
{$Mode objFPC}
uses math;
const
  FINP='';
  FOUT='';
  MAXN=999;
type
  big=array[0..MAXN] of longint;
operator + (a,b:big) c:big;
var
  i,nho:longint;
begin
  fillchar(c,sizeof(c),0);
  c[0]:=max(a[0],b[0]); nho:=0;
  for i:=1 to c[0] do
    begin
      c[i]:=a[i]+b[i]+nho;
      if c[i]<10 then nho:=0
      else begin nho:=1; c[i]-=10; end;
    end;
  if nho=1 then begin inc(c[0]); c[c[0]]:=1; end;
end;
var
  f1,f2:text;
  n,test:longint;
  f00,f01:array[1..MAXN] of big;
  lt2:array[0..MAXN] of big;
procedure openF;
begin
  assign(f1,FINP); reset(f1);
  assign(f2,FOUT); rewrite(f2);
end;
procedure closeF;
begin
  close(f1);
  close(f2);
end;
procedure init;
var
  i:longint;
begin
  lt2[0][0]:=1; lt2[0][1]:=1;
  for i:=1 to 999 do lt2[i]:=lt2[i-1]+lt2[i-1];
  f00[1][0]:=1;
  f01[1][0]:=1; f01[1][1]:=1;
  for i:=2 to 999 do
    begin
      f00[i]:=f01[i-1];
      f01[i]:=lt2[i-2]+f00[i-1];
    end;
end;
procedure print(var a:big);
var
  i:longint;
begin
  for i:=a[0] downto 1 do
    write(f2,a[i]);
  writeln(f2);
end;
begin
  init;
  openF;
  while not eof(f1) do
    begin
      readln(f1,n);
      print(f00[n]);
    end;
  closeF;
end.

Code mẫu của hieult

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

int main()
{
   // freopen("M00PAIR.in","r",stdin);
    int n;
    char c[1001][600];
    c[0][0]='0';
    c[0][1]='\0';
    c[1][0]='0';
    for(int i=2;i<=1000;i++)
    {
        int l,du;
        if(i%2==0) l=1;
        else l=-1;
        c[i][0]=((c[i-1][0]-48)*2+l)%10 + 48;
        du = ((c[i-1][0]-48)*2+l)/10;
        for(int j=1;j<strlen(c[i-1]);j++)
        {
             //if(i==11) printf("**%d**\n",du);
             c[i][j]=((c[i-1][j]-48)*2+du)%10 + 48;
             du = ((c[i-1][j]-48)*2+du)/10;
        }
        int m=i-1;
        if(du>0)
        {
        c[i][strlen(c[m])]=du+48;
        c[i][strlen(c[m])+1]='\0';
        }
        else c[i][strlen(c[m])]='\0';

      //  printf("%d\n",i);
    }
    int chay=0;
    while(scanf("%d",&n)>0&&n>0)
    {
        chay++;
       // if(chay>1)
       // printf("\n");
       // printf("%s\n",c[n]);
        for(int i=strlen(c[n])-1;i>=0;i--)
             printf("%c",c[n][i]);
        printf("\n");
    }
    //printf("%d",strlen(c[1]));
   // getch();
}

Code mẫu của ll931110

Program M00PAIR;
        Const
                input  = '';
                output = '';
                  maxn = 1000;
                  maxd = 40;
                  maxi = 35;
                remain = 1000000000000;
        Var
                p00,p01,p10,p11: array[1..maxn + 1,1..maxd] of qword;
                              p: array[1..maxd] of qword;
                              n: integer;
                          fi,fo: text;

Procedure openfile;
          Begin
                Assign(fi, input);
                        Reset(fi);

                Assign(fo, output);
                        Rewrite(fo);
          End;

Procedure optimize;
          Var
                i,j: integer;
          Begin
                Fillchar(p00, sizeof(p00), 0);
                Fillchar(p01, sizeof(p01), 0);
                Fillchar(p10, sizeof(p10), 0);
                Fillchar(p11, sizeof(p11), 0);
                Fillchar(p, sizeof(p), 0);

                p[1]:= 1;
                p01[1,1]:= 1;
                For i:= 2 to maxn do
                  Begin
                        For j:= 1 to maxi do
                          Begin
                                p00[i,j]:= p00[i,j] + p01[i - 1,j];
                                If p00[i,j] >= remain then
                                  Begin
                                        p00[i,j + 1]:= p00[i,j + 1] + p00[i,j] div remain;
                                        p00[i,j]:= p00[i,j] mod remain;
                                  End;

                                p11[i,j]:= p11[i,j] + p10[i - 1,j];
                                If p11[i,j] >= remain then
                                  Begin
                                        p11[i,j + 1]:= p00[i,j + 1] + p00[i,j] div remain;
                                        p11[i,j]:= p11[i,j] mod remain;
                                  End;

                                p01[i,j]:= p01[i,j] + p00[i - 1,j] + p[j];
                                If p01[i,j] >= remain then
                                  Begin
                                        p01[i,j + 1]:= p01[i,j + 1] + p01[i,j] div remain;
                                        p01[i,j]:= p01[i,j] mod remain;
                                  End;

                                p10[i,j]:= p10[i,j] + p11[i - 1,j] + p[j];
                                If p10[i,j] >= remain then
                                  Begin
                                        p10[i,j + 1]:= p10[i,j + 1] + p10[i,j] div remain;
                                        p10[i,j]:= p10[i,j] mod remain;
                                  End;
                          End;

                        For j:= 1 to maxi do p[j]:= p[j] * 2;
                        For j:= 1 to maxi do if p[j] >= remain then
                          Begin
                                p[j + 1]:= p[j + 1] + p[j] div remain;
                                p[j]:= p[j] mod remain;
                          End;
                  End;
          End;

Procedure printresult;
          Var
                n,i,j,k: integer;
                      s: string;
          Begin
                While not eof(fi) do
                  Begin
                        Readln(fi, n);
                        If n = 1 then writeln(fo, 0) else
                          Begin
                                k:= maxi;
                                While p00[n,k] = 0 do dec(k);

                                Write(fo, p00[n,k]);
                                For i:= k - 1 downto 1 do
                                  Begin
                                    str(p00[n,i], s);
                                    For j:= 1 to 12 - length(s) do write(fo, 0);
                                    Write(fo, s);
                                  End;
                                  Writeln(fo);
                          End;
                  End;
          End;

Procedure closefile;
          Begin
                Close(fo);
                Close(fi);
          End;

Begin
        openfile;
        optimize;
        printresult;
        closefile;
End.

Code mẫu của khuc_tuan

// {$APPTYPE CONSOLE}
 {$mode delphi}

const
    MAXCS = 40;
    COSO = 100000000;

type
    BigNum = class
        a : array[1..MAXCS] of integer;
        constructor init;
        procedure add(b : BigNum);
        procedure print();
        function clone : BigNum;
    end;

constructor BigNum.init;
var
    i : integer;
begin
    for i:=1 to MAXCS do
        a[i] := 0;
end;

procedure BigNum.add(b : BigNum);
var
    n, i : integer;
begin
    n := 0;
    for i:=1 to MAXCS do
    begin
        n := n + a[i] + b.a[i];
        a[i] := n mod COSO;
        n := n div COSO;
    end;
end;

procedure BigNum.print;
var
    i, j, c, k, x : integer;
begin
    for i:=MAXCS downto 1 do if a[i]>0 then
    begin
        write(a[i]);
        for j:=i-1 downto 1 do
        begin
            c := COSO;
            x := a[j];
            for k:=1 to 8 do
            begin
                c := c div 10;
                write(x div c);
                x := x mod c;
            end;
        end;
        writeln;
        exit;
    end;
    writeln(0);
end;

function BigNum.clone : BigNum;
var
    r : BigNum;
    i : integer;
begin
    r := BigNum.init;
    for i:=1 to MAXCS do r.a[i] := a[i];
    clone := r;
end;


var
    n, i, j, k : integer;
    F : array[1..1000,0..1,0..1] of BigNum;
    sl : BigNum;
begin
    for i:=1 to 1000 do
        for j:=0 to 1 do
            for k:=0 to 1 do
                F[i,j,k] := BigNum.init;
    sl := BigNum.init;
    F[1][0][1].a[1] := 1;
    sl.a[1] := 1;
    for i:=2 to 1000 do
    begin
        F[i][0][0] := F[i-1][0][1].clone;
        F[i][1][1] := F[i-1][1][0].clone;
        F[i][1][0] := sl.clone;
        F[i][1][0].add(F[i-1][1][1]);
        F[i][0][1] := sl.clone;
        F[i][0][1].add(F[i-1][0][0]);
        sl.add(sl);
    end;
    while not eof do
    begin
        // n := -1;
        readln(n);

        F[n][0][0].print;
    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.