QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#99576#4229. GCD HarmonyAnwar_Gehad_Maghraby#TL 44ms199636kbC++202.0kb2023-04-23 04:56:302023-04-23 04:56:33

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-04-23 04:56:33]
  • 评测
  • 测评结果:TL
  • 用时:44ms
  • 内存:199636kb
  • [2023-04-23 04:56:30]
  • 提交

answer


#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

const int N = 5e3 + 2;
const int MOD = 1e9 + 7 ;


int a[N] ;

vector<int> ad[N];

int dp[N][N*2] , n;

vector<int> pr[2*N + 4] ;

int sol( int  i , int x , int p = 0)
{
         int & ret= dp[i][x] ;

         if(~ret)return ret ;

         bool s = 1 ;
         for(int pri : pr[x])  s &= (bool)( count( pr[a[i]].begin() , pr[a[i]].end() , pri) ) ;

         if(s) x= a[i] , ret =0 ;
         else ret = x ;

         int sz = (int) pr[x].size() ;

         for(int ch : ad[i])
         {
                  if(ch == p) continue;

                  int mn = 2*n;

                  for(int msk = 1 ; msk < 1 << sz; msk++)
                  {
                           int y = 1 ;

                           for(int j = 0 ;j < sz ; j++) {

                                    if( msk & (1 << j) ) y *= pr[x][j] ;
                           }

                           mn = min(mn , sol(ch , y , i) ) ;
                  }

                  ret += mn ;
         }

         ret = min(ret , 2*n) ;

         return ret ;
}


int main()
{
         cin.tie(0);cin.sync_with_stdio(0);
         cout.tie(0);cout.sync_with_stdio(0);

         for(int i =2 ; i <= N+N ; i++)
         {
                  if(pr[i].empty() )
                  {
                           for(int j = i ; j <= N+N ; j += i) pr[j].push_back(i);
                  }
         }

         cin >> n ;

         for(int i =1 ; i <= n ;i++) cin >> a[i] ;


         for (int i = 0; i < n - 1; ++i) {
                  int u , v;
                  cin >> u >> v;
                  ad[u].push_back(v);
                  ad[v].push_back(u);
         }

         memset(dp , -1 , sizeof dp) ;

         int ans = 2*n ;

         for(int v = 2 ; v <= N+N ; v++) ans = min(ans , sol(1 , v) ) ;

         cout << ans ;

         return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 36ms
memory: 199532kb

input:

6
5
6
3
4
9
12
1 2
1 3
1 4
1 6
3 5

output:

6

result:

ok single line: '6'

Test #2:

score: 0
Accepted
time: 28ms
memory: 199532kb

input:

3
1
2
3
3 1
2 3

output:

4

result:

ok single line: '4'

Test #3:

score: 0
Accepted
time: 34ms
memory: 199528kb

input:

13
2
5
5
5
5
5
5
3
3
3
3
3
3
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
1 11
1 12
1 13

output:

15

result:

ok single line: '15'

Test #4:

score: 0
Accepted
time: 44ms
memory: 199444kb

input:

9
2
5
5
5
5
3
3
3
3
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9

output:

14

result:

ok single line: '14'

Test #5:

score: 0
Accepted
time: 35ms
memory: 199636kb

input:

8
13
13
13
2
13
13
13
13
1 2
1 3
1 4
1 5
1 6
1 7
1 8

output:

13

result:

ok single line: '13'

Test #6:

score: -100
Time Limit Exceeded

input:

5000
59
25
51
26
33
99
2
13
29
58
5
47
96
83
63
22
69
89
41
90
20
97
85
90
55
17
54
75
54
24
90
54
74
78
81
77
2
47
68
18
60
81
99
86
7
6
76
43
17
43
92
25
36
26
47
100
63
66
2
16
47
25
48
86
24
2
10
42
44
80
92
48
49
21
49
40
32
85
53
88
15
30
4
27
77
16
6
80
50
56
46
14
3
48
92
50
93
35
69
29
48
4...

output:


result: