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