Hướng dẫn giải của Cân thăng bằng


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 <bits/stdc++.h>

using namespace std;

const int N = 111;
const int V = 69999;
const int INF = 0x3f3f3f3f;

int a[N];
int dp[V];

int gcd(int a, int b) {
    while (b) a %= b, swap(a, b);
    return a;
}

void solve() {
    int n; cin >> n;
    memset(dp, 0x3f, sizeof(dp));
    dp[0] = 0;
    vector<int> state (1, 0);
    for (int i = 1; i <= n; ++i) {
        cin >> a[i];
        for (int j = 0; j < state.size(); ++j) {
            int g = gcd(state[j], a[i]);
            if (dp[g] == INF) state.push_back(g);
            dp[g] = min(dp[g], dp[state[j]] + 1);
        }
    }
    int g = 0;
    for (int i = 1; i <= n; ++i) g = gcd(g, a[i]);
    int ans = INF;
    for (int i = 1; i <= g; ++i) if (g % i == 0) ans = min(ans, dp[i]);
    cout << ans << '\n';
}

int main() {
    ios_base::sync_with_stdio(false);
    int nTest; cin >> nTest;
    while (nTest--) solve();
    return 0;
}

Code mẫu của RR

{$R+,Q+}
PROGRAM RTF;
CONST
  FINP='';
  FOUT='';
  maxn=100;
TYPE
  mang=array[1..maxn] of longint;
VAR
  fi,fo:text;
  kq,n:integer;
  d:longint;
  a,b:mang;
  v:array[0..maxn] of longint;
  ok:boolean;
procedure openFiles;
begin
  assign(fi,FINP); reset(fi);
  assign(fo,FOUT); rewrite(fo);
end;
procedure closeFiles;
begin
  close(fi); close(fo);
end;
procedure readInput;
var
  i:integer;
begin
  readln(fi,n);
  for i:=1 to n do
    read(fi,a[i]);
end;
procedure writeOutput;
begin
  writeln(fo,kq);
  ok:=true;
end;
function gcd(a,b:longint):longint;
begin
  if a<b then gcd:=gcd(b,a)
  else if b=0 then gcd:=a
  else gcd:=gcd(b,a mod b);
end;
function UCLN(var a:mang; n:integer):longint;
var
  d,i:longint;
begin
  if n=1 then exit(a[1]);
  d:=a[1];
  for i:=2 to n do
    d:=gcd(a[i],d);
  UCLN:=d;
end;
procedure DFS(i,k:integer);
var
  j:integer;
begin
  if ok then exit;
  for j:=v[i-1]+1 to n-k+i do
    begin
      if ok then exit;
      v[i]:=j;
      b[i]:=a[j];
      if i<k then DFS(i+1,k)
      else if UCLN(b,k)=1 then
        begin
          writeOutput;
          exit;
        end;
    end;
end;
procedure solve;
var
  t,i,j:longint;
begin
  readln(fi,t);
  for i:=1 to t do
    begin
      readInput;
      kq:=0; ok:=false; d:=UCLN(a,n);
      v[0]:=0;
      for j:=1 to n do
        a[j]:=a[j] div d;
      repeat
        inc(kq);
        DFS(1,kq);
      until ok;
    end;
end;
BEGIN
  openFiles;
  solve;
  closeFiles;
END.

Code mẫu của hieult

#include <cstdio>
//#include <conio.h>
#define maxn 102

int A[maxn],B[maxn],n,t,kq,nn,UC;
bool ok;

int GCD(int a,int b)
{
    int r;
    while(b>0)
    {
        r = a%b;
        a = b;
        b = r;
    }
    return a;
}

void check()
{
     int i,UCC;
     UCC = A[B[1]];
     for(int i = 2;i<=nn;i++) UCC = GCD(UCC,A[B[i]]);
     if(UCC == UC) ok = true;
}

int thu(int i)
{
     int j;
     if(ok) return 0;
     else
     {
         for(j = B[i-1]+1;j<=n;j++)
         {
             B[i] = j;
             if(i==nn) check();
             else thu(i+1);
             if(ok) return 0;
         }
     }
}
int main()
{
    int test;
    scanf("%d",&test);
    for(int ii = 1;ii<=test;ii++)
    {
    scanf("%d",&n);
    for(int i = 1;i<=n;i++)
        scanf("%d",&A[i]);
    UC = A[1];
    for(int i = 2;i<=n;i++) UC = GCD(UC,A[i]);
    for(nn=1;nn<=n;nn++)
    {
        for(int i = 1;i<=n;i++)
            B[i] = 0;
            ok = false;
        thu(1);
        if(ok) {kq = nn;break;}
    }
    printf("%d\n",kq);
    }
    //getch();
}

Code mẫu của khuc_tuan

import java.io.*;
import java.util.*;

public class Main {

    static int n;
    static int[] a, d;

    static int ucln(int a,int b) {
        if(a==0 || b==0) return a+b;
        else return ucln(b,a%b);
    }

    static void init() {
        int uc = a[0];
        for(int i=1;i<n;++i) uc = ucln(uc,a[i]);
        for(int i=0;i<n;++i) a[i] /= uc;
    }

    static void process() {
        init();

        Arrays.fill(d, 0);
        Queue<Integer> q = new LinkedList<Integer>();
        for(int i=0;i<n;++i) {
            d[a[i]] = 1;
            q.add(a[i]);
        }
        while(!q.isEmpty()) {
            int x = q.remove();
            for(int i=0;i<n;++i) {
                int tmp = ucln(x,a[i]);
                if(d[tmp]==0 || d[tmp]>d[x]+1) {
                    d[tmp] = d[x]+1;
                    q.add(tmp);
                }
            }
        }

        System.out.println(d[1]);

    }

    public static void main(String[] args) throws Exception {
        BufferedReader kb = new BufferedReader( new InputStreamReader(System.in));
        int st = Integer.parseInt(kb.readLine());
        d = new int[70001];
        for(int i=0;i<st;++i) {
            n = Integer.parseInt(kb.readLine());
            StringTokenizer stt = new StringTokenizer(kb.readLine());
            a = new int[n];
            for(int j=0;j<n;++j) a[j] = Integer.parseInt(stt.nextToken());
            Arrays.sort(a);
            process();
        }
    }
}

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.