Hướng dẫn giải của VM 08 Bài 06 - Những con số


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 ladpro98

#include <iostream>
#include <cstdio>
#include <iomanip>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <climits>
#include <numeric>
#include <vector>
#include <queue>
#include <map>
#include <utility>
#define FOR(i, a, b) for(int i = (a); i < (b); i++)
#define REP(i, a, b) for(int i = (a); i <=(b); i++)
#define FORD(i, a, b) for(int i = (a); i > (b); i--)
#define REPD(i, a, b) for(int i = (a); i >=(b); i--)
#define SZ(a) (int((a).size()))
#define ALL(a) (a).begin(), a.end()
#define PB push_back
#define MP make_pair
#define LL long long
#define LD long double
#define II pair<int, int>
#define X first
#define Y second
#define VI vector<int>
const int N = 50050;
const int lim = 1e6 + 6;
using namespace std;
int a[N], F[lim];
int n, num;
VI ans[N];

int main() {
    ios :: sync_with_stdio(0); cin.tie(0);
    cin >> n;
    REP(i, 1, n) cin >> a[i];
    sort(a + 1, a + 1 + n);
    REP(i, 1, n) {
        if (a[i] == a[i - 1]) F[a[i]]++;
        else {
            int srt = min(int(sqrt(a[i])) + 1, max(a[i] - 1, 1));
            REP(j, 1, srt)
            if (a[i] % j == 0)
                F[a[i]] = max(F[a[i]], max(F[j], F[a[i] / j]) + 1);
        }
        ans[F[a[i]]].PB(a[i]);
        num = max(num, F[a[i]]);
    }
    cout << num << '\n';
    REP(i, 1, num) {
        cout << int(SZ(ans[i])) << ' ';
        FOR(j, 0, SZ(ans[i]))
            cout << ans[i][j] << ' ';
        cout << '\n';
    }
    return 0;
}

Code mẫu của RR

//Written by RR
{$R-,Q-}
{$Mode objfpc}
{$inline on}

uses math;
const
  FINP          =       '';
  FOUT          =       '';
  MAXN          =       50111;
  oo            =       1000111;
type
  Llist         =       ^node;
  node          =       record
                                u:longint;
                                next:Llist;
                        end;
var
  f1,f2         :       text;
  n             :       longint;
  a,f           :       array[1..MAXN] of longint;
  pos           :       array[1..oo] of longint;
  list          :       array[1..MAXN] of Llist;
  size          :       array[1..MAXN] of longint;
  p,lt          :       array[1..MAXN] of longint;

const
  MAXV          =       1000;
  MAXP          =       trunc((MAXV/ln(MAXV))*150/100);

var
  dd            :       array[1..MAXV] of byte;
  prime         :       array[1..MAXP] of longint;
  sprime        :       longint;

procedure generate;
    var
      i,j,gh:longint;
    begin
      gh:=trunc(sqrt(MAXV));
      for i:=2 to gh do
      if dd[i]=0 then
        begin
          inc(sprime);
          prime[sprime]:=i;
          j:=i*i;
          while j<=MAXV do
            begin
              dd[j]:=1;
              inc(j,i);
            end;
        end;

      for i:=gh+1 to MAXV do
        if dd[i]=0 then
          begin
            inc(sprime);
            prime[sprime]:=i;
          end;
    end;

procedure openF;
    begin
      assign(f1,FINP); reset(f1);
      assign(f2,FOUT); rewrite(f2);
    end;
procedure closeF;
    begin
      close(f1);
      close(f2);
    end;
procedure add(u:longint; var a:Llist); inline;
    var
      p:Llist;
    begin
      new(p); p^.u:=u;
      p^.next:=a; a:=p;
    end;
procedure swap(var a,b:longint); inline;
    var
      temp:longint;
    begin
      temp:=a; a:=b; b:=temp;
    end;
procedure sort(l,r:longint); inline;
    var
      i,j,mid:longint;
    begin
      i:=l; j:=r; mid:=a[l+random(r-l+1)];
      repeat
        while a[i]<mid do inc(i);
        while a[j]>mid do dec(j);
        if i<=j then
          begin
            swap(a[i],a[j]);
            inc(i); dec(j);
          end;
      until i>j;
      if i<r then sort(i,r);
      if l<j then sort(l,j);
    end;
procedure inp;
    var
      i:longint;
    begin
      read(f1,n);
      for i:=1 to n do
        read(f1,a[i]);
    end;

var
  sp,now        :       longint;

procedure duyet(i,k:longint); inline;
    var
      j,jj,save:longint;
    begin
      jj:=1; save:=now;
      for j:=0 to lt[i] do
        begin
          if i<sp then duyet(i+1,k)
          else
              if pos[now]>0 then f[k]:=max(f[k],f[pos[now]]+1);
          now:=now*p[i];
        end;
      now:=save;
    end;

procedure solve;
    var
      i,u,x:longint;
    begin
      for i:=1 to n do
        begin
          f[i]:=1;
          u:=a[i];

          sp:=0;
          for x:=1 to sprime do
            begin
              if prime[x]*prime[x]>u then break;
              if u mod prime[x]=0 then
                begin
                  inc(sp);
                  p[sp]:=prime[x];
                  lt[sp]:=0;
                  while u mod p[sp]=0 do
                    begin
                      u:=u div p[sp];
                      inc(lt[sp]);
                    end;
                end;
            end;
          if u>1 then
            begin
              inc(sp);
              p[sp]:=u;
              lt[sp]:=1;
          end;

          now:=1;
          duyet(1,i);

          pos[a[i]]:=i;
        end;
    end;
procedure ans;
    var
      i,ln,u:longint;
      p:Llist;
    begin
      ln:=0;
      for i:=1 to n do
        begin
          add(a[i],list[f[i]]);
          ln:=max(ln,f[i]);
          inc(size[f[i]]);
        end;
      writeln(f2,ln);
      for i:=1 to ln do
        begin
          write(f2,size[i],' ');
          p:=list[i];
          while p<>nil do
            begin
              u:=p^.u; p:=p^.next;
              write(f2,u,' ');
            end;
          writeln(f2);
        end;
    end;

begin
  openF;
  generate;
  inp;
  sort(1,n);
  solve;
  ans;
  closeF;
end.

Code mẫu của hieult

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
//#include <conio.h>

using namespace std;

int n,a[55555],f[55555],d[1111111],kq = 0;
vector<int> V[10000];

int main(){
   // freopen("NUMBERS.in","r",stdin);
      scanf("%d",&n);
      memset(f,0,sizeof(f));
      memset(d,0,sizeof(d));
      for(int i = 0;i<n;i++) scanf("%d",&a[i]);
      sort(a,a+n);
      for(int i = 0;i<n;i++){
           if(i>0 && a[i]==a[i-1]){
                d[a[i]]++;
                f[i] = f[i-1]+1;
           }
           else{
                 d[a[i]] = 1;
                 if(a[i]!=1)
                       d[a[i]] = max(d[a[i]],d[1]+1);
                 for(int j = 2;j*j<=a[i];j++){
                       if(a[i]%j==0){
                             d[a[i]] = max(d[a[i]],d[j]+1);
                             d[a[i]] = max(d[a[i]],d[a[i]/j]+1);
                       }
                 }
                 f[i] = d[a[i]];
           }
           kq = max(kq,f[i]);
           V[f[i]].push_back(a[i]);
      }
      printf("%d\n",kq);
      //getch();
      for(int i = 1;i<=kq;i++){
            printf("%d ",V[i].size());  
            for(int j = 0;j<V[i].size();j++)
                printf("%d ",V[i][j]);
            printf("\n");
      }
     // getch();
}

Code mẫu của khuc_tuan

#include <iostream>
#include <sstream>
#include <queue>
#include <map>
#include <set>
#include <algorithm>
#include <vector>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;

#define Rep(i,n) for(int i=0;i<(n);++i)
#define For(i,a,b) for(int i=(a);i<=(b);++i)
#define Ford(i,a,b) for(int i=(a);i>=(b);--i)
#define Fit(i,v) for(__typeof(v.begin()) i=v.begin();i!=v.end();++i)
#define Fill(a,b) memset((a), (b), sizeof(a))
#define pb push_back
#define MP make_pair

typedef long long LL;

int n, a[50050], F[50050];
vector<pair<int,int> > ds;
int vt[1000060];

int main() {
    scanf("%d", &n);
    Rep(i,n) scanf("%d", a+i);
    sort( a, a+n);
    Rep(i,n) vt[a[i]] = i+1;
    Rep(i,n) {
        if(i==0) F[i] = 0;
        else if(a[i]==a[i-1]) F[i] = F[i-1]+1;
        else {
            for(int d=1;d*d<=a[i];++d) if(a[i]%d==0) {
                if(vt[d]) F[i] >?= 1 + F[vt[d]-1];
                if(d!=1 && vt[a[i]/d]) F[i] >?= 1 + F[vt[a[i]/d]-1];
            }
        }
        ds.pb(MP(F[i],a[i]));
    }
    int res = 0;
    Rep(i,n) res >?= F[i]; 
    printf("%d\n", res+1);
    sort( ds.begin(), ds.end());
    int last = 0;
    Rep(i,ds.size()+1) {
        if(i==ds.size() || (i!=0 && ds[i].first!=ds[i-1].first)) {
            printf("%d", i - last);
            For(j,last,i-1) printf(" %d", ds[j].second);
            printf("\n");
            last = i;
        }
    }
    //system("pause");
    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.