Hướng dẫn giải của Lát gạch


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 base=1000000000;
      dg=9;
type bignum=array[0..5] of longint;
var n,i,t:longint;
    f:array[1..100] of bignum;

procedure plus(var a,b,c:bignum);
var i,mem:longint;
begin
     a[0]:=b[0]; mem:=0;
     for i:=1 to a[0] do
     begin
          a[i]:=b[i]+c[i]+mem;
          if a[i]>=base then
          begin
                a[i]:=a[i]-base;
                mem:=1
          end
          else mem:=0;
     end;
     if mem=1 then
     begin
        inc(a[0]);
        a[a[0]]:=mem;
     end;
end;

procedure wf(a:bignum);
var i,j,l:longint;    s:string;
begin
     for i:=a[0] downto 1 do
     begin
        if i<a[0] then
        begin
                str(a[i],s);
                l:=length(s);
                for j:=l+1 to dg do write(0);
        end;
        write(a[i]);
     end;
     writeln;
end;

begin
        f[1,0]:=1; f[1,1]:=1;
        f[2,0]:=1; f[2,1]:=2;
        for i:=3 to 100 do plus(f[i],f[i-1],f[i-2]);
        read(t);
        for i:=1 to t do
        begin
                read(n);
                wf(f[n]);
        end;
end.

Code mẫu của happyboy99x

#include <cstdio>
#include <algorithm>
using namespace std;

#define L_MAX 1000 //length max
#define RADIX 1000000000
#define N_MAX 100 + 2

#define REP(i, n) for( int i = 0, _n = (n); i < _n ; ++i )
#define REPD(i, n) for( int i = (n)-1; i >= 0; --i )
#define FOR(i, a, b) for( int i = (a), _b = (b); i <= _b; ++i )

int f[N_MAX][L_MAX];
int l[N_MAX];
int countNum;

//----------------------------PROTOTYPE-------------------------------
void init();
void calc(int, int);
void plus(int *, int *, int *, int, int, int & );
void print( int *, int l );
//--------------------------------------------------------------------

void init() {
   f[0][0] = 0; l[0] = 1;
   f[1][0] = 1; l[1] = 1;
   countNum = 2;
}

void calc( int a, int b ) {
    countNum = b + 1;
    FOR(i, a, b) plus( f[i-1], f[i-2], f[i], l[i-1], l[i-2], l[i] );
}

void print( int a[], int l ) {
    printf( "%d", a[l-1] );
    REPD(i, l-1) printf( "%09d", a[i] );
}

void plus( int a[], int b[], int c[], int la, int lb, int &lc ) {
    int carry = 0;
    lc = max(la, lb);
    REP(i, lc) {
        c[i] = a[i] + b[i] + carry;
        if ( c[i] >= RADIX ) {
            carry = 1;
            c[i] -= RADIX;
        } else carry = 0;
    }
    if (carry) c[lc++] = 1;
}

int main() {
    init();
    int tc, n; scanf("%d",&tc);
    while ( tc-- && scanf( "%d", &n) == 1 ) {
        if ( n+1 >= countNum ) calc( countNum, n+1 );
        print( f[n+1], l[n+1] );
        printf( "\n" );
    }
    return 0;
}

Code mẫu của ladpro98

program latgach;
uses    math;
type    bignum=string[30];
const   fi='';
var     n,t,i:longint;
        f:array[1..100] of string[30];
        inp:text;
function cong(a,b:bignum):bignum;
var     c:bignum;
        x,y,sum,i,carry:longint;
begin
        c:='';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;
                sum:=x+y+carry;
                carry:=sum div 10;
                c:=chr(sum mod 10 + 48) + c;

        end;
        if carry>0 then c:='1'+c;
        exit(c);
end;

begin
        assign(inp,fi);
        reset(inp);
        readln(inp,t);
        f[1]:='1';
        f[2]:='2';
        for i:=3 to 100 do
                f[i]:=cong(f[i-1],f[i-2]);
        for i:=1 to t do
        begin
                readln(inp,n);
                writeln(f[n]);
        end;
        close(inp);
end.

Code mẫu của hieult

#include<stdio.h>
#include<string.h>
main()
{
int x,a[100],i,b[23],c[23],m;
scanf("%d",&x);
for(int j=0;j<x;j++)
  scanf("%d",&a[j]);
for(int j=0;j<x;j++)
  {
  for(int k=0;k<=21;k++)
    { b[k]=0;c[k]=0; }
  b[22]=0;
  c[22]=1;
  i=0;
  while(1)
    {
    for(int t=22;t>=0;t--)
      {   m=b[t];
          b[t]=(b[t]+c[t])%10;
          if(b[t]<c[t]||m==10)
          b[t-1]++;
      }
    i++;
    if(i==a[j])
      {
      int u=0;
      for(int t=0;t<=22;t++)
        { u+=b[t];
          if(u==0) continue;
          printf("%d",b[t]%10);
        }
      printf("\n");
      break;
      }
    for(int t=22;t>=0;t--)
      {   m=c[t];
          c[t]=(b[t]+c[t])%10;
          if(c[t]<b[t]||m==10)
          c[t-1]++;
      }
    i++;
    if(i==a[j])
      {
      int u=0;
      for(int t=0;t<=22;t++)
        { u+=c[t];
          if(u==0) continue;
          printf("%d",c[t]%10);
        }
      printf("\n");
      break;
      }
    }
  }
}

Code mẫu của ll931110

Program LATGACH;
        Const
                Input  = '';
                Output = '';
        Var
              d,test: array[1..100] of byte;
                   F: array[1..100,1..30] of byte;
                 i,n: integer;

Procedure enter;
          Var
                fi: text;
                 i: integer;
          Begin
                Assign(fi, input);
                        Reset(fi);
                        Readln(fi, n);
                        For i:= 1 to n do readln(fi, test[i]);
                Close(fi);
                Fillchar(F, sizeof(F), 0);
          End;

Procedure calc;
          Var
                i,j: integer;
          Begin
                F[1,1]:= 1;             d[1]:= 1;
                F[2,1]:= 2;             d[2]:= 1;

                For i:= 3 to 100 do
                    Begin
                        For j:= 1 to d[i - 1] do
                            Begin
                                F[i,j]:= F[i,j] + F[i - 1,j] + F[i - 2,j];
                                If F[i,j] > 9 then
                                        Begin
                                                F[i,j + 1]:= 1;
                                                F[i,j]:= F[i,j] - 10;
                                        End;
                            End;
                        d[i]:= d[i - 1];
                        If F[i, d[i - 1] + 1] <> 0 then inc(d[i]);
                    End;
          End;

Procedure printresult;
          Var
                fo: text;
                 i,j: integer;
          Begin
                Assign(fo, output);
                        Rewrite(fo);
                        For i:= 1 to n do
                            Begin
                              For j:= d[test[i]] downto 1 do write(fo, F[test[i],j]);
                              Writeln(fo);
                            End;
                Close(fo);
          End;

Begin
        enter;
        calc;
        printresult;
End.

Code mẫu của skyvn97

program latgach;
uses crt;
type
    bignum=string;
const
     max=111;
var
   opt:array[1..max] of bignum;
   t,c,n:integer;
   a,b:bignum;
function bigplus(a,b:bignum):bignum;
         var
            i,carry,s:integer;
            result:bignum;
         begin
              result:='';
              while length(a)<length(b) do a:='0'+a;
              while length(b)<length(a) do b:='0'+b;
              carry:=0;
              for i:=length(a) downto 1 do
                  begin
                       s:=ord(a[i])+ord(b[i])+carry-96;
                       carry:=s div 10;
                       result:=chr(s mod 10+48)+result;
                  end;
              if carry=1 then result:='1'+result;
              bigplus:=result;
         end;
procedure init;
          var
             i:integer;
          begin
               opt[1]:='1';
               opt[2]:='2';
               for i:=3 to max do
                   opt[i]:=bigplus(opt[i-1],opt[i-2]);
          end;
begin
     init;
     readln(t);
     for c:=1 to t do
         begin
              readln(n);
              writeln(opt[n]);
         end;
end.

Code mẫu của khuc_tuan

import java.io.*;
import java.util.*;
import java.math.*;
public class Main {
public static void main(String[] args) {
BigInteger[] f = new BigInteger[101];
f[0] = BigInteger.ONE;
f[1] = BigInteger.ONE;
for(int i=2;i<101;++i) f[i] = f[i-1].add(f[i-2]);
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
for(int i=0;i<t;++i) System.out.println(f[sc.nextInt()]);
}
}

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.