Hướng dẫn giải của Tung đồng xu


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=10000;
      base=1000000000;
      dg=9;
type bignum=array[0..340] of longint;
var n,k:longint;
    re,p:bignum;
    g:array[0..maxn] of bignum;

procedure rf;
begin
     read(n,k);
end;

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

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

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

procedure pr;
var i,j:longint;
begin
     p[0]:=1; p[1]:=1;
     g[0,0]:=1; g[0,1]:=1; re[0]:=1;
     for i:=1 to k-1 do
     begin
          mul(p);
          for j:=0 to p[0] do g[i,j]:=p[j];
     end;
     for i:=k to n do
     begin
          mul(p);
          mul(re);
          if i>k then plus(re,g[i-k-1])
          else re[1]:=1;
          if i<=n-k-1 then minus(g[i],p,re);
     end;
end;

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

begin
     assign(input,fi); reset(input);
     assign(output,fo); rewrite(output);
     rf;
     pr;
     wf;
     close(input); close(output);
end.

Code mẫu của ladpro98

#include <bits/stdc++.h>
const int MOD = 100000000;
using namespace std;
typedef vector<int> big;

int n, k;
big F[10005];

big operator + (const big &a, const big &b) {
    big c; int carry = 0;
    for(int i = 0; i < a.size() || i < b.size(); i++) {
        if (i < a.size()) carry += a[i];
        if (i < b.size()) carry += b[i];
        c.push_back(carry % MOD);
        carry /= MOD;
    }
    if (carry) c.push_back(carry);
    return c;
}

big operator - (const big &a, const big &b) {
    big c; int borrow = 0, s;
    for(int i = 0; i < a.size(); i++) {
        s = a[i] - borrow;
        if (i < b.size()) s -= b[i];
        if (s < 0) {
            s += MOD;
            borrow = 1;
        }
        else 
            borrow = 0;
        c.push_back(s);
    }
    while (!c.empty() && c[c.size() - 1] == 0) c.pop_back();
    return c;

}

void print(big a) {
    printf("%d", a[a.size() - 1]);
    for(int i = a.size() - 2; i >= 0; i--)
        printf("%08d", a[i]);
    printf("\n");
}

int main() {
    scanf("%d %d", &n, &k);
    F[0].push_back(1);
    big prev; prev.push_back(1);
    big POW; POW.push_back(1);
    for(int i = 1; i <= n + 1; i++) {
        F[i] = prev;
        prev = prev + F[i];
        if (i >= k)
            prev = prev - F[i - k];
        if (i <= n)
            POW = POW + POW;
    }
    print(POW - F[n + 1]);
    return 0;
}

Code mẫu của RR

{$R+,Q+}
{$Mode objFPC}
uses math;
const
  FINP='';
  FOUT='';
  MAXN=10000;
  oo=100000000;
type
  big=array[0..400] of longint;
var
  f1,f2:text;
  n,k:longint;
  d:array[-1..MAXN] of big;
  lt2:big;
procedure openF;
begin
  assign(f1,FINP); reset(f1);
  assign(f2,FOUT); rewrite(f2);
end;
procedure closeF;
begin
  close(f1); close(f2);
end;
procedure solve;
var
  scs,nho,i,t:longint;
  temp:int64;
begin
  d[k][0]:=1; d[k][1]:=1;
  lt2[0]:=1; lt2[1]:=1;
  for i:=k+1 to n do
    begin
      scs:=max(max(d[i-1,0],d[i-k-1,0]),lt2[0]);
      nho:=0; t:=i-k-1;
      for scs:=1 to scs do
        begin
          temp:=d[i-1,scs]<<1-d[t,scs];
          temp+=int64(lt2[scs])+nho;
          if (temp<oo) and (temp>=0) then begin nho:=0; d[i,scs]:=temp; end
          else if temp>=0 then begin nho:=temp div oo; d[i,scs]:=temp mod oo; end
          else begin nho:=-1; d[i,scs]:=temp+oo; end;
        end;
      if nho>0 then
        begin inc(scs); d[i,scs]:=nho; end;
      d[i,0]:=scs;
      scs:=lt2[0]; nho:=0;
      for scs:=1 to scs do
        begin
          lt2[scs]:=lt2[scs]<<1+nho;
          if lt2[scs]<oo then nho:=0 else begin lt2[scs]-=oo; nho:=1; end;
        end;
      if nho>0 then begin inc(lt2[0]); lt2[lt2[0]]:=nho; end;
    end;
end;
procedure ans;
var
  i,ii:longint;
  s:string[10];
begin
  write(f2,d[n,d[n,0]]);
  for i:=d[n,0]-1 downto 1 do
    begin
      str(d[n,i],s);
      for ii:=8-length(s) downto 1 do write(f2,'0');
      write(f2,s);
    end;
  writeln(f2);
end;
begin
  openF;
  read(f1,n,k);
  solve;
  ans;
  closeF;
end.

Code mẫu của hieult

#include <cstdio>
#include <iostream>
//#include <conio.h>
#define base 1000000000

using namespace std;

struct solon
{
     int so;
     long long a[400];
};

int n,k;
solon F[11111],t;

solon tong (solon A,solon B)
{
      int du = 0;
      solon C;
      if(A.so<B.so)
      {
           C = A; 
           A = B;
           B = C;
      }
      for(int i = B.so+1;i<=A.so;i++) B.a[i] = 0;
      C.so = A.so;
      for(int i = 1;i<=A.so;i++)
      {
          C.a[i] = (A.a[i]+B.a[i]+du)%base;
          du = (A.a[i]+B.a[i]+du)/base;
      }
      if(du>0) {C.so++; C.a[C.so] = du;}
      return C;
}

solon tichnho(solon A,long long k,int chuso)
{
      solon C;
      long long du = 0;
      C.so = A.so+chuso;
      for(int i = 1;i<=chuso;i++)
           C.a[i] = 0;
      for(int i = chuso+1;i<=chuso+A.so;i++)
      {
           C.a[i] = (A.a[i-chuso]*k+du)%base;
           du = (A.a[i-chuso]*k+du)/base;
      }
      if(du>0) {C.so++; C.a[C.so] = du;}
      return C;
}

solon tich2(solon A){
      solon C;
      int du = 0;
      C.so = A.so;
      for(int i = 1;i<=A.so;i++){
            C.a[i] = (A.a[i]*2+du);
            if(C.a[i]>=base){
                   C.a[i]-=base;
                   du = 1;
            }
            else du = 0; 
      }
      if(du>0) {C.so++; C.a[C.so] = du;}
      return C; 
}

solon tich(solon A,solon B)
{
      solon C;
      C.so = 1; C.a[1] = 0;
      for(int i = 1;i<=B.so;i++)
      {
           C = tong(C,tichnho(A,B.a[i],i-1));
      }
      return C;
}

void print(solon A)
{
      printf("%lld",A.a[A.so]);
      for(int i = A.so-1;i>=1;i--)
          printf("%09lld",A.a[i]);
}

solon hieu(solon A,solon B){
      solon C; C.so = A.so;
      for(int i = B.so+1;i<=A.so;i++)
           B.a[i] = 0;
      int du = 0;
      for(int i = 1;i<=A.so;i++){
           C.a[i] = A.a[i]-B.a[i]-du;
           if(C.a[i]<0){
                C.a[i]+=base;
                du = 1;
           }
           else du = 0;  
      }
      while(C.a[C.so]==0) C.so--;
      if(C.so==0) C.so = 1; 
      return C;
}

solon Hieu(solon A,solon B){
      solon C; C.so = A.so;
      int du = 0;
      for(int i = 1;i<=A.so;i++){
           if(i>B.so) B.a[i] = 0;
           if(i>t.so) t.a[i] = 0;
           C.a[i] = A.a[i]-B.a[i]+t.a[i]-du;
           if(C.a[i]<0){
                C.a[i]+=base;
                du = 1;
           }
           else if(C.a[i]>=base){
                C.a[i]-=base;
                du = -1;
           }
           else du = 0;  
      }
      if(du == -1) C.a[++C.so] = 1;
      while(C.a[C.so]==0) C.so--;
      if(C.so==0) C.so = 1; 
      return C;
}



int main()
{
      scanf("%d %d",&n,&k);
      t.so = 1; t.a[1] = 1;
      for(int i = 0;i<=n;i++){
            if(i<k){
                  F[i].so = 1 ;
                  F[i].a[1] = 0;
            }
            else if(i==k) {
                  F[i].so = 1;
                  F[i].a[1] = 1;
            }
            else{
                  F[i] = Hieu(tich2(F[i-1]),F[i-k-1]);
                  t = tich2(t);
            }
      }
      print(F[n]);
    //  getch();
}

Code mẫu của khuc_tuan

import java.util.*;
import java.math.*;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int k = sc.nextInt();
        BigInteger[] F = new BigInteger[n+1];
        F[0] = BigInteger.ONE;
        BigInteger total = BigInteger.ONE;
        for(int i=1;i<=n;++i) {

            F[i] = total;
            if(i<k) F[i] = F[i].add(BigInteger.ONE);

            total = total.add( F[i]);
            if(i>=k) total = total.subtract(F[i-k]);
        }
        BigInteger res = BigInteger.ONE;
        for(int i=0;i<n;++i) res = res.multiply(BigInteger.valueOf(2));
        System.out.println(res.subtract(F[n]));
    }
}

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.