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.
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