Hướng dẫn giải của Bội số chung nhỏ nhất


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=350;
      maxp=70;
var n:longint;
    p:array[0..maxp] of longint;
    f:array[0..maxn,0..maxp] of qword;
    re:array[1..maxn] of qword;

procedure rf;
begin
     assign(input,fi); reset(input);
     assign(OUTput,fo); rewrite(output);
end;

procedure prime;
var i,j,t:longint;
begin
     for i:=2 to maxn do
     begin
          t:=0;
          for j:=2 to trunc(sqrt(i)) do
              if i mod j=0 then inc(t);
          if t=0 then
          begin
               inc(p[0]); p[p[0]]:=i;
          end;
     end;
end;

function max(x,y:qword):qword;
begin
     if x>y then max:=x else max:=y;
end;

procedure pr;
var i,j:longint; t:qword;
begin
     prime;
     for i:=0 to maxn do f[i,0]:=1;
     for i:=0 to maxp do f[0,i]:=1;
     for i:=1 to maxn do
         for j:=1 to maxp do
         begin
              if (p[j]>i) or (p[j]=0) then break;
              f[i,j]:=max(f[i-1,j],f[i,j-1]);
              t:=p[j];
              while t<=i do
              begin
                   f[i,j]:=max(f[i,j],f[i-t,j-1]*t);
                   t:=t*p[j];
              end;
              if f[i,j]>re[i] then re[i]:=f[i,j];
         end;
end;

procedure wf;
var i,t:longint;
begin
  readln(t);
  for i:=1 to t do
  begin
   readln(n); writeln(re[n]);
  end;
     close(input);
     close(output);
end;

begin
     rf;
     pr;
     wf;
end.

Code mẫu của happyboy99x

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

const int N = 350, M = 70;
bool pr[N+1];
vector<int> p;
long long f[N+1][M+1];

void eratos() {
    memset(pr, -1, sizeof pr); pr[0] = pr[1] = 0;
    for(int i = 2; i * i <= N; ++i) if(pr[i])
        for(int j = i + i; j <= N; j += i) pr[j] = 0;
    for(int i = 0; i <= N; ++i) if(pr[i]) p.push_back(i);
}

void solve() {
    for(int j = 0; j <= M; ++j) f[0][j] = 1;
    for(int i = 1; i <= N; ++i) 
        for(int j = 1; j <= M; ++j) {
            f[i][j] = max(f[i][j-1], f[i-1][j]);
            for(int d = p[j-1]; i >= d; d *= p[j-1]) f[i][j] = max(f[i][j], f[i-d][j-1] * d);
        }
}

int main() {
    eratos();
    solve();
    int tc, n; scanf("%d", &tc);
    while(tc--) {
        scanf("%d", &n);
        if(n <= N-3) printf("%lld\n", f[n][M]);
        else puts("14757354782123793840");
    }
    return 0;
}

Code mẫu của ladpro98

#include <bits/stdc++.h>
#define qword unsigned long long

const int N = 360;

using namespace std;

bool isPrime[N];
int P[N];
int nPrime;
qword dp[N][N];

void sieve() {
    memset(isPrime, 1, sizeof(isPrime));
    for (int i = 2; i * i < N; ++i) if (isPrime[i]) {
        for (int j = i * i; j < N; j += i)
            isPrime[j] = 0;
    }
    for (int i = 2; i < N; ++i)
        if (isPrime[i]) P[++nPrime] = i;
}

void update(int nxtI, int nxtJ, int i, int j, qword target) {
    if (dp[nxtI][nxtJ] < target)
        dp[nxtI][nxtJ] = target;
}

void preCalc() {
    for (int i = 0; i < N; ++i) dp[i][0] = 1;
    for (int i = 1; i <= nPrime; ++i) dp[P[i]][i] = P[i];
    for (int i = 0; i < N; ++i) for (int j = 0; j < nPrime && P[j] <= i; ++j) {
        update(i, j + 1, i, j, dp[i][j]);
        for (int p = 1; i + p < N; p *= P[j + 1])
            update(i + p, j + 1, i, j, dp[i][j] * p);
    }
}

void solve() {
    int n;
    cin >> n;
    qword ans = 0;
    for (int i = 0; i <= nPrime && P[i] <= n; ++i)
        ans = max(ans, dp[n][i]);
    cout << ans << '\n';
}

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    sieve();
    preCalc();
    int nTest;
    cin >> nTest;
    while (nTest--) solve();
    return 0;
}

Code mẫu của RR

const f:array[1..350] of qword=(
1,2,3,4,6,6,12,15,20,30,
30,60,60,84,105,140,210,210,420,420,
420,420,840,840,1260,1260,1540,2310,2520,4620,
4620,5460,5460,9240,9240,13860,13860,16380,16380,27720,
30030,32760,60060,60060,60060,60060,120120,120120,180180,180180,
180180,180180,360360,360360,360360,360360,471240,510510,556920,1021020,
1021020,1141140,1141140,2042040,2042040,3063060,3063060,3423420,3423420,6126120,
6126120,6846840,6846840,6846840,6846840,8953560,9699690,12252240,19399380,19399380,
19399380,19399380,38798760,38798760,58198140,58198140,58198140,58198140,116396280,116396280,
116396280,116396280,140900760,140900760,157477320,157477320,232792560,232792560,232792560,232792560,
281801520,446185740,446185740,446185740,446185740,892371480,892371480,1338557220,1338557220,1338557220,
1338557220,2677114440,2677114440,2677114440,2677114440,2677114440,2677114440,3375492120,3375492120,5354228880,
5354228880,5354228880,5354228880,5354228880,5354228880,6750984240,6750984240,7216569360,7216569360,8172244080,
12939386460,13385572200,13831757940,13831757940,25878772920,25878772920,38818159380,38818159380,41495273820,41495273820,
77636318760,77636318760,82990547640,82990547640,82990547640,82990547640,82990547640,82990547640,155272637520,155272637520,
165981095280,165981095280,165981095280,165981095280,165981095280,165981095280,209280511440,209280511440,232908956280,232908956280,
388181593800,401120980260,414952738200,414952738200,414952738200,802241960520,802241960520,1203362940780,1203362940780,1203362940780,
1203362940780,2406725881560,2406725881560,2406725881560,2406725881560,2406725881560,2406725881560,2872543794120,2872543794120,4813451763120,
4813451763120,4813451763120,4813451763120,4813451763120,4813451763120,5745087588240,5745087588240,6141300525360,6141300525360,7220177644680,
7220177644680,12033629407800,12033629407800,12033629407800,12033629407800,12033629407800,12033629407800,14440355289360,14841476269620,24067258815600,
24067258815600,24067258815600,29682952539240,29682952539240,44524428808860,44524428808860,44524428808860,44524428808860,89048857617720,89048857617720,
89048857617720,89048857617720,98675761143960,98675761143960,103489212907080,103489212907080,178097715235440,178097715235440,178097715235440,178097715235440,
197351522287920,197351522287920,206978425814160,206978425814160,222622144044300,222622144044300,267146572853160,267146572853160,445244288088600,445244288088600,
445244288088600,445244288088600,493378805719800,493378805719800,534293145706320,534293145706320,890488576177200,890488576177200,890488576177200,890488576177200,
986757611439600,986757611439600,1034892129070800,1217001054108840,1217001054108840,1825501581163260,1825501581163260,1914550438780980,1914550438780980,3651003162326520,
3651003162326520,3829100877561960,3829100877561960,3829100877561960,3829100877561960,4243057729190280,4243057729190280,7302006324653040,7302006324653040,7658201755123920,
7658201755123920,7658201755123920,7658201755123920,8486115458380560,8486115458380560,9127507905816300,9127507905816300,10953009486979560,10953009486979560,18255015811632600,
18255015811632600,19145504387809800,19145504387809800,19145504387809800,19145504387809800,21906018973959120,21906018973959120,36510031623265200,36510031623265200,38291008775619600,
38291008775619600,38291008775619600,38291008775619600,42430577291902800,42430577291902800,42430577291902800,52331045326680120,54765047434897800,78496567990020180,78496567990020180,
78496567990020180,78496567990020180,156993135980040360,156993135980040360,156993135980040360,156993135980040360,171597148629346440,171597148629346440,179967741245412120,179967741245412120,
313986271960080720,313986271960080720,313986271960080720,313986271960080720,343194297258692880,343194297258692880,359935482490824240,359935482490824240,392482839950100900,392482839950100900,
470979407940121080,470979407940121080,784965679900201800,784965679900201800,784965679900201800,784965679900201800,857985743146732200,857985743146732200,941958815880242160,941958815880242160,
1569931359800403600,1569931359800403600,1569931359800403600,1569931359800403600,1715971486293464400,1715971486293464400,1799677412454121200,1799677412454121200,1799677412454121200,1799677412454121200,
2354897039700605400,2354897039700605400,2354897039700605400,2459559130353965640,2573957229440196600,3689338695530948460,3689338695530948460,3689338695530948460,4709794079401210800,7378677391061896920,
7378677391061896920,7378677391061896920,7378677391061896920,7378677391061896920,7378677391061896920,8320636206942139080,8320636206942139080,14757354782123793840,14757354782123793840,14757354782123793840);
var
test,n:longint;
begin
read(test);
for test:=1 to test do
begin
read(n);
writeln(f[n]);
end;
end.

Code mẫu của hieult

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

int main()
{
    unsigned long long f[351][72];
    int u[80],t=1;
    u[1] = 2;
    for(int i = 3;i<=355;i++)
    {
        int flag = 0;
        for(int j = 1;;j++)
        {
            if(u[j]>sqrt(i))
                break;
            else if(i%u[j]==0)
            {
                flag=1;
                break;
            }
        }
        if(flag==0)
        {
            t++;
            u[t]=i;
        }
    }
    //printf("%d",u[t]);
    for(int i = 1;i<=350;i++)
        for(int j = 0;j<=t;j++)
            f[i][j]=0;
    for(int j = 0;j<=t;j++)
       f[0][j] = 1;

    for(int i = 1;i<=350;i++)
    {
        for(int j = 1;;j++)
        {
            if(u[j]>i)
               break;
            else
            {
                unsigned long long max = 0;
                if(f[i-1][j]> max )
                    max = f[i-1][j];
                if(f[i][j-1]>max)
                    max = f[i][j-1];
                int t= u[j];
                while(i-t>=0)
                {
                    if(f[i-t][j-1]*t>max)
                       max = f[i-t][j-1]*t;
                    t=t*u[j];
                }
                f[i][j]=max;
            }

        }
    }

    int test,n;
    scanf("%d",&test);
    for(int ii = 1;ii<=test;ii++)
    {
        scanf("%d",&n);
        if(n==1) printf("1\n");
        else
        {
        unsigned long long Kq = 0;
        for(int i = 1;i<=70;i++)
        {
           if(f[n][i]>Kq)
               Kq=f[n][i];
        }
        printf("%llu\n",Kq);
        }
    }
    //getch();
}

Code mẫu của ll931110

{$MODE DELPHI,N+}
program CTNOWN;
const
  input  = '';
  output = '';
  maxn = 350;
  maxk = 500;
  maxd = 3;
  base = 1000000;
  maxv = 1000000;
var
  F: array[0..maxn,0..maxk] of extended;
  trace: array[0..maxn,0..maxk] of integer;
  d: array[1..maxd] of integer;
  list: array[1..maxk] of integer;
  fi,fo: text;
  n,nlist: integer;
  i,nTest: integer;

procedure openfile;
begin
  assign(fi, input);
    reset(fi);

  assign(fo, output);
    rewrite(fo);
end;

function prime(x: integer): boolean;
var
  i: integer;
begin
  for i := 2 to trunc(sqrt(x)) do if x mod i = 0 then exit(false);
  prime := true;
end;

procedure solve;
var
  i,j,t: integer;
begin
  nlist := 0;
  for i := 2 to maxn do if prime(i) then
    begin
      inc(nlist);
      list[nlist] := i;
    end;

  fillchar(F, sizeof(F), 0);
  for j := 1 to nlist do
    for i := 2 to maxn do
      begin
       F[i,j] := F[i,j - 1];
       trace[i,j] := i;

       t := list[j];
       while i >= t do
         begin
           if F[i,j] < F[i - t,j - 1] + ln(t) then
             begin
               F[i,j] := F[i - t,j - 1] + ln(t);
               trace[i,j] := i - t;
             end;
           t := t * list[j];
         end;
      end;
end;

procedure mul(x: integer);
var
  i: integer;
begin
  if x = 0 then exit;
  for i := 1 to maxd do d[i] := d[i] * x;
  for i := 1 to maxd - 1 do if d[i] >= base then
    begin
      d[i + 1] := d[i + 1] + d[i] div base;
      d[i] := d[i] mod base;
    end;
end;

procedure printresult;
var
  i,u,k,s,tmp: integer;
  st: string;
  max: extended;
begin
  readln(fi, n);
  max := 0;
  u := 0;
  for i := 1 to maxk do
    if max < F[n,i] then
      begin
        max := F[n,i];
        u := i;
      end;

  fillchar(d, sizeof(d), 0);
  d[1] := 1;
  s := n;

  for k := u downto 1 do
    begin
      tmp := trace[s,k];
      mul(s - tmp);
      s := tmp;
    end;

  s := maxd;
  while d[s] = 0 do dec(s);

  write(fo, d[s]);
  for i := s - 1 downto 1 do
    begin
      str(d[i],st);
      for k := 1 to 6 - length(st) do write(fo, 0);
      write(fo, st);
    end;
  writeln(fo);
end;

procedure closefile;
begin
  close(fo);
  close(fi);
end;

begin
  openfile;
  solve;

  readln(fi, nTest);
  for i := 1 to nTest do printresult;

  closefile;
end.

Code mẫu của khuc_tuan

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


const int COSO = 10000;

struct BigInt {
    int a[20];
    void assign(int x) {
        a[0] = x;
        for(int i=1;i<20;++i)
            a[i] = 0;
    }
    void viet() {
        for(int i=20-1;i>=0;--i) 
            if(a[i] > 0) {
                printf("%d",a[i]);
                for(int j=i-1;j>=0;--j)
                    printf("%04d",a[j]);
                break;
            }
    }
    BigInt opMul(int x){
        BigInt b;
        int nho = 0;
        for(int i=0;i<20;++i) {
            nho += a[i] * x;
            b.a[i] = nho % COSO;
            nho /= COSO;
        }
        return b;
    }
    int opCmp(BigInt b) {
        for(int i=20-1;i>=0;--i) {
            if(a[i] < b.a[i]) return -1;
            if(a[i] > b.a[i]) return 1;
        }   
        return 0;
    }
};

const int MAXN = 355;

BigInt F[MAXN][300];

int prime[1000];

int main() {

    int nprime = 0;
    for(int i=2;i<300;++i) {
        bool isprime = true;
        for(int j=2;j*j<=i;++j) 
            if(i % j == 0) {
                isprime = false;
                break;
            }
        if(isprime)
            prime[nprime++] = i;
    }   

    for(int i=0;i<MAXN;++i) {
        if(i < 2) F[i][0].assign(1);
        else {
            int z = 2;
            while(2 * z <= i) z *= 2;
            F[i][0].assign(z);
        }
    }

    for(int p=1;p<nprime;++p) {
        for(int i=0;i<MAXN;++i) {
            F[i][p] = F[i][p-1];
            int z = prime[p];
            while(z <= i) {
                BigInt tmp = F[i-z][p-1] .opMul( z );
                if(F[i][p] .opCmp( tmp ) < 0) {
                    F[i][p] = tmp;
                }
                z *= prime[p];
            }
        }
    }

    int ntest, n;
    scanf("%d",&ntest);
    for(int test=0;test<ntest;++test) {
        scanf("%d",&n);
        F[n][nprime-1].viet();
        printf("\n");
    }
    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.