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


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=10000;
type bignum=array[0..1000] of longint;
var n,m,sum:longint;
    re:bignum; kt:boolean;

procedure rf;
var i,t:longint;
begin
     readln(m,n);
     sum:=0;
     for i:=1 to n do
     begin
          read(t);
          sum:=sum+t;
     end;
    kt:=true;
end;

procedure multi(var re:bignum;b:longint);
var mem,i,t:longint;
begin
     mem:=0;
     for i:=1 to re[0] do
     begin
          t:=re[i]*b+mem;
          re[i]:=t mod base;
          mem:=t div base;
     end;
     if mem>0 then
     begin
          inc(re[0]);
          re[re[0]]:=mem;
     end;
end;

procedure divide(var re:bignum;b:longint);
var mem,i,j:longint;
    t:bignum;
begin
     mem:=0;
     fillchar(t,sizeof(t),0);
     for i:=re[0] downto 1 do
     begin
          j:=re[i]+mem*base;
          if j<b then
          begin
               t[i]:=0;
               mem:=j;
          end
          else
          begin
               t[i]:=j div b;
               mem:=j mod b;
          end;
     end;
     for i:=re[0] downto 1 do
         if t[i]>0 then break;
     re[0]:=i;
     for i:=re[0] downto 1 do
         re[i]:=t[i];
end;

procedure pr;
var i,k,p,j:longint;
begin
     k:=m-(sum+n-1);
     if k<0 then
        begin
        kt:=false;
        exit;
    end;
     p:=n+k;
     if k>n then k:=n;
     re[0]:=1; re[1]:=1;
     for i:=1 to k do
     begin
          multi(re,p-i+1);
          divide(re,i);
     end;
end;

procedure wf;
var i,j,l:longint; s:string;
begin
     if not kt then write(0)
     else
     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 4 do write(0);
          end;
          write(re[i]);
     end;
end;

begin
     rf;
     pr;
     wf;
end.

Code mẫu của happyboy99x

#include<bits/stdc++.h>
using namespace std;

const int BASE = 10000, MAXLEN = 100;
struct BigInteger {
    int d[MAXLEN], n;

    BigInteger (int x = 0) {
        memset(d, 0, sizeof d); n = 0;
        for(; x != 0; x /= BASE) d[n++] = x % BASE;
    }

    void operator = (int x) {
        memset(d, 0, sizeof d); n = 0;
        for(; x != 0; x /= BASE) d[n++] = x % BASE;
    }

    BigInteger operator + (const BigInteger &x) const {
        BigInteger res; res.n = max(n, x.n);
        int rem = 0;
        for(int i = 0; i < res.n; ++i) {
            int t = x.d[i] + d[i] + rem;
            res.d[i] = t % BASE;
            rem = t / BASE;
        }
        if(rem) res.d[res.n++] = rem;
        return res;
    }
};

ostream& operator << (ostream &out, const BigInteger &x) {
    if(x.n == 0) out << 0;
    else {
        out << x.d[x.n-1];
        for(int i = x.n-2; i >= 0; --i)
            out << setfill('0') << setw(4) << x.d[i];
    }
    return out;
}

const int N = 1000;
BigInteger f[N+1][2];
int n, m, a[N];

int main() {
    ios::sync_with_stdio(false);
    cin >> n >> m;
    for(int i = 0; i < m; ++i) cin >> a[i];
    for(int i = 1; i < m; ++i) ++a[i];
    for(int i = 0; i <= n; ++i) f[i][0] = 1;
    for(int j = 1; j <= m; ++j) {
        f[0][j % 2] = 0;
        for(int i = 1; i <= n; ++i) {
            if(i >= a[j-1]) f[i][j % 2] = f[i-1][j % 2] + f[i-a[j-1]][(j-1) % 2];
            else f[i][j % 2] = f[i-1][j % 2];
        }
    }
    cout << f[n][m % 2] << '\n';
    return 0;
}

Code mẫu của ladpro98

program lem6;
uses    math,sysutils;
type    big=string;
const   maxn=1234;
        fi='';
var     sieve:array[1..maxn] of boolean;
        prime,a:array[1..maxn] of longint;
        n,sum,d,m:longint;
        res:big;
procedure input;
var     inp:text;
        i,j,c:longint;
begin
        assign(inp,fi);
        reset(inp);
        readln(inp,n,m);
        for i:=1 to m do
        begin
                read(inp,c);
                inc(sum,c);
        end;
        close(inp);
end;

procedure init;
var     i,j:longint;
begin
        fillchar(sieve,sizeof(sieve),true);
        for i:=2 to maxn do
        begin
                if sieve[i] then
                begin
                        j:=i*i;
                        while j<=maxn do
                        begin
                                sieve[j]:=false;
                                inc(j,i);
                        end;
                end;
        end;
        for i:=2 to maxn do
        if sieve[i] then
        begin
                inc(d);
                prime[d]:=i;
        end;
end;

procedure up(n:longint);
var     i,t:longint;
begin
        for i:=1 to d do
        if prime[i]>n then break
        else
        begin
                t:=prime[i];
                while n>=t do
                begin
                        inc(a[i],n div t);
                        t:=t*prime[i];
                end;
        end;
end;

procedure down(n:longint);
var     i,t:longint;
begin
        for i:=1 to d do
        if prime[i]>n then break
        else
        begin
                t:=prime[i];
                while n>=t do
                begin
                        dec(a[i], n div t);
                        t:=t*prime[i];
                end;
        end;
end;

function mul(a:big; b:longint):big;
var     i,carry,s:longint;
        c:big;
begin
        c:='';
        carry:=0;
        for i:=length(a) downto 1 do
        begin
                s:=(ord(a[i])-48)*b+carry;
                carry:=s div 10;
                c:=chr(s mod 10+48)+c;
        end;
        if carry>0 then
        c:=inttostr(carry)+c;
        exit(c);
end;

function pow(x,i:longint):longint;
var     t:longint;
begin
        if i=1 then exit(x);
        t:=pow(x,i div 2);
        if odd(i) then
                exit(sqr(t)*x);
        exit(sqr(t));

end;

procedure process;
var     k,q,i,p:longint;
begin
        k:=m;
        q:=n-sum+1;
        if k>q then
        begin
                res:='0';
                exit;
        end;
        up(q);
        down(k);
        down(q-k);
        res:='1';
        for i:=1 to d do
        begin
                if a[i]=0 then continue;
                p:=pow(prime[i],a[i]);
                res:=mul(res,p);
        end;
end;

begin
        input;
        init;
        process;
        write(res);
end.

Code mẫu của RR

{$R-,Q-}
uses math;
const
  FINP='';
  FOUT='';
  MAXN=80;
  oo=1000000000;
type
  bigNum=array[0..MAXN] of longint;
var
  a:array[1..1011] of longint;
  d:array[0..1,-10..1011] of bigNum;
  m,n:longint;
  f1,f2:text;
operator +(a:bigNum;var b:bigNum) c:bigNum;
var
  nho,i:longint;
begin
  nho:=0;
  fillchar(c,sizeof(c),0); c[0]:=max(a[0],b[0]);
  for i:=MAXN downto MAXN-c[0]+1 do
    begin
      c[i]:=a[i]+b[i]+nho;
      nho:=c[i] div oo;
      c[i]:=c[i] mod oo;
    end;
  if nho>0 then
    begin
      inc(c[0]);
      c[MAXN-c[0]+1]:=nho;
    end;
end;
procedure print(a:bigNum);
var
  i:longint;
  s:string;
begin
  if a[0]=0 then begin writeln(f2,0); exit; end;
  write(f2,a[MAXN-a[0]+1]);
  for i:=MAXN-a[0]+2 to MAXN do
    begin
      str(a[i],s);
      while length(s)<9 do s:='0'+s;
      write(f2,s);
    end;
  writeln(f2);
end;
procedure openF;
begin
  assign(f1,FINP); reset(f1);
  assign(f2,FOUT); rewrite(f2);
end;
procedure closeF;
begin
  close(f1);
  close(f2);
end;
procedure inp;
var
  i:longint;
begin
  read(f1,n,m);
  for i:=1 to m do read(f1,a[i]);
end;
procedure solve;
var
  i,j:longint;
begin
  for i:=-1 to n do
    begin
      d[0,i,0]:=1;
      d[0,i,MAXN]:=1;
    end;
  for i:=1 to m do
    if i mod 2=1 then
      begin
        fillchar(d[1],sizeof(d[1]),0);
        for j:=1 to n do
        if j>=a[i] then
          d[1,j]:=d[1,j-1]+d[0,j-a[i]-1];
      end
    else {i mod 2=1}
      begin
        fillchar(d[0],sizeof(d[0]),0);
        for j:=1 to n do
        if j>=a[i] then
          d[0,j]:=d[0,j-1]+d[1,j-a[i]-1];
      end;
end;
begin
  openF;
  inp;
  solve;
  print(d[m mod 2,n]);
  closeF;
end.

Code mẫu của hieult

#include<iostream>
#define base 1000000000
#define nm 1001
//#include <conio.h>
using namespace std;
int tren[nm];
int duoi[nm];
long long kq[nm];
int b[nm];
int t=nm-1;
int n,m;
long long power(int x,int y)
{
     if (y==0)return 1;
     long long u=power(x,y/2);
     if (y%2==0)return u*u;
     return u*u*x;
}
void process(int a[],int n)
{
     for (int i=2;i*i<=n;i++)
     {
         if (n%i==0)
            for (int p=1;n%i==0;p++)
            {
                n/=i;
                a[i]++;
            }
     }
     if (n>1)
     a[n]++;
}
void mul(long long k,int&t)
{
     long long temp,nho=0;
     for (int i=1000;i>=t;i--)
     {
         temp=kq[i]*k+nho;
         kq[i]=temp%base;
         nho=temp/base;
     }
     while (nho>0)
     {
           t--;
           kq[t]=nho%base;
           nho=nho/base;
     }
}
int main()
{
    scanf ("%d%d",&n,&m);
    for (int i=0;i<m;i++)
    {
        scanf ("%d",&b[i]);
        n = n-b[i];
    }
    n++;
    if (n<m)
    {
       printf ("0");
       return 0;
    }
    for (int i=n;i>m;i--)
        process(tren,i);
    for (int i=n-m;i>=2;i--)
        process(duoi,i);
    kq[1000]=1;
    for (int i=1000;i>=2;i--)
    {
        tren[i]-=duoi[i];
        if (tren[i])
        {
           long long k=power(i,tren[i]);
           mul(k,t);
        }
    }
    printf ("%lld",kq[t]);
    for (int i=t+1;i<=1000;i++)
        printf("%09lld",kq[i]);
      //  getch();
    //return 0;
}

Code mẫu của ll931110

Program LEM6;
        Const
                input  = '';
                output = '';
        Type
                arr = array[1..200] of byte;
        Var
                p: arr;
                a: array[1..500] of integer;
                F: array[1..500,0..1000] of arr;
                d: array[1..500,0..1000] of integer;
            n,m,t: integer;

Procedure init;
          Var
                fi: text;
                 i: integer;
          Begin
                Assign(fi, input);
                        Reset(fi);
                                Readln(fi, n, m);
                                For i:= 1 to m do read(fi, a[i]);
                Close(fi);
          End;

Procedure addbignum(var x,y,z: arr; m,n: integer);
          Var
                i,k: integer;
          Begin
                If m > n then k:= m else k:= n;
                For i:= 1 to k do
                        Begin
                                z[i]:= z[i] + x[i] + y[i];
                                If z[i] > 99 then
                                        Begin
                                                z[i]:= z[i] - 100;
                                                inc(z[i + 1]);
                                        End;
                        End;
                If z[k + 1] <> 0 then t:= k + 1 else t:= k;
          End;

Procedure optimize;
          Var
                i,k,s: integer;
          Begin
                Fillchar(F[1], sizeof(F[1]), 0);

                Fillchar(p, sizeof(p), 0);

                p[1]:= 1;
                s:= 0;

                F[1,a[1],1]:= 1;
                d[1,a[1]]:= 1;

                For i:= a[1] + 1 to n do
                    Begin
                        addbignum(F[1,i - 1],p,F[1,i],d[1,i - 1],1);
                        d[1,i]:= t;
                    End;

                For i:= 2 to m do
                    Begin
                        s:= s + a[i - 1] + 1;
                        For k:= s to n do
                            Begin
                                  addbignum(F[i,k - 1],F[i - 1,k - a[i] - 1],F[i,k],
                                                        d[i,k - 1],d[i - 1,k - a[i] - 1]);
                                  d[i,k]:= t;
                            End;
                    End;
          End;

Procedure printresult;
          Var
                fo: text;
                 i: integer;
          Begin
                Assign(fo, output);
                        Rewrite(fo);
                        Write(fo, F[m,n,d[m,n]]);
                        For i:= d[m,n] - 1 downto 1 do
                                Begin
                                        if F[m,n,i] < 10 then write(fo, 0);
                                        write(fo, F[m,n,i]);
                                End;
                Close(fo);
          End;

Begin
        init;
        optimize;
        printresult;
End.

Code mẫu của skyvn97

import java.util.*;
import java.lang.*;
import java.math.*;
import java.io.*;
public class Main {
    public static void main(String args[]) {
        InputStream inputStream=System.in;
        OutputStream outputStream=System.out;
        InputReader in=new InputReader(inputStream);
        PrintWriter out=new PrintWriter(outputStream);
        LEM6 solver=new LEM6();
        solver.solve(in,out);
        out.close();
    }
}
class LEM6 {
    public void solve(InputReader in,PrintWriter out) {
        int n=in.nextInt();
        int m=in.nextInt();
        int s=0;
        for (int i=0;i<m;i=i+1) s+=in.nextInt();
        if (s+m-1>n) {
            out.println(0);
            return;
        }
        if (m==1) {
            out.println(n-s+1);
            return;
        }
        BigInteger[][] comb=new BigInteger[m+1][n+1];
        for (int i=0;i<=m;i=i+1)
            for (int j=0;j<=n;j=j+1) {
                if (i>j) comb[i][j]=BigInteger.ZERO;
                if (i==j) comb[i][j]=BigInteger.ONE;
                if (i<j) {
                    if (i==0) comb[i][j]=BigInteger.ONE;
                    else comb[i][j]=comb[i][j-1].add(comb[i-1][j-1]);
                }
            }
        BigInteger res=BigInteger.ZERO;
        for (int x=m-1;x+s<=n;x=x+1) res=res.add(comb[m-2][x-1].multiply(BigInteger.valueOf(n-x-s+1)));
        out.println(res.toString());
    }
}
class InputReader {
    public BufferedReader reader;
    public StringTokenizer tokenizer;
    public InputReader(InputStream stream) {
        reader=new BufferedReader(new InputStreamReader(stream),32768);
        tokenizer=null;
    }
    public String next() {
        while (tokenizer==null || !tokenizer.hasMoreTokens()) {
            try {
                tokenizer=new StringTokenizer(reader.readLine());
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
        return tokenizer.nextToken();
    }
    public int nextInt() {
        return Integer.parseInt(next());
    }
    public long nextLong() {
        return Long.parseLong(next());
    }
}

Code mẫu của khuc_tuan

#include <iostream>

using namespace std;

#define coso 100000000
#define maxcs 30

struct BigNum {
    int a[maxcs];
    int cs;
};

int n, m, a[1010];
BigNum F[1010][550];

void cong(BigNum &a, BigNum &b) {
    int cc = a.cs >? b.cs, i, n;
    for(i=n=0;i<cc;++i) a.a[i] += b.a[i] + n, n = a.a[i] / coso, a.a[i] %= coso;
    if(n!=0) a.a[cc++] = n;
    a.cs = cc;
}

int main() {
    cin >> n >> m;
    for(int i=0;i<m;++i) cin >> a[i];
    for(int i=0;i<=n;++i) F[i][0].a[0] = 1, F[i][0].cs = 1;
    for(int i=0;i<=n;++i) for(int j=0;j<m;++j) {
        int ni = i + a[j] + (j==0?0:1);
        if(ni<=n) cong(F[ni][j+1], F[i][j]);
        if(i<n) cong( F[i+1][j], F[i][j]);
    }
    int *res = F[n][m].a, ok = true;
    for(int i=maxcs-1;i>=0;--i) if(res[i]>0) {
        printf("%d", res[i]);
        for(int j=i-1;j>=0;--j) printf("%08d",res[j]);
        ok = false;
        break;
    }
    if(ok) puts("0");
    return 0;
}

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.