QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#625082#4229. GCD HarmonyNYCU_CartesianTree#WA 1ms3660kbC++202.3kb2024-10-09 17:23:282024-10-09 17:23:29

Judging History

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

  • [2024-10-09 17:23:29]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:3660kb
  • [2024-10-09 17:23:28]
  • 提交

answer

//============================================================================
// Name        : E.cpp
// Author      : 
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <bits/stdc++.h>
using namespace std;
const int N = 5005, V = 100;
int min_div[10005];
vector<pair<int, vector<int> > > can_use;
vector<int> point_div[N];
int a[N];
vector<int> prime;
vector<int> graph[N];
int dp[N][105];


int dfs(int x, int fa = 0){

	for(auto i : graph[x]){
		if(i == fa)
			continue;
		dfs(i, x);
	}
	int ans = 1e9;
	for(int i = 0; i < can_use.size(); i++){
		int val = can_use[i].first;
		vector<int> &divider = can_use[i].second;
		int sum = 0;
		if(point_div[x] != divider){
			sum = val;
		}
		for(auto j : graph[x]){
			if(j == fa)
				continue;
			int minn = 1e9;
			for(auto k : prime){
				if(val % k == 0){
					minn = min(minn, dp[j][k]);
				}
			}
			sum += minn;
		}
		for(auto j : divider){
			dp[x][j] = min(dp[x][j], sum);
		}
		ans = min(ans, sum);
	}
	return ans;
}


int main() {
	for(int i = 2; i <= 100; i++){
		if(!min_div[i]){
			min_div[i] = 1;
			prime.push_back(i);
			for(int j = i * i; j <= 10000; j += i){
				if(min_div[j] == 0){
					min_div[j] = i;
				}
				min_div[j] = min(min_div[j], i);
			}
		}
	}
	for(int i = 1; i <= 10000; i++){
		map<int, int> cnt;
		int x = i;
		while(min_div[x] > 1){
			cnt[min_div[i]]++;
			x /= min_div[i];
		}
		if(x > 100){
			continue;
		}
		cnt[x]++;
		bool can = 1;
		for(auto j : cnt){
			if(j.second > 1){
				can = 0;
				break;
			}
		}
		if(can){
			can_use.push_back({i, vector<int>()});
			vector<int> &divider = can_use[(int)can_use.size() - 1].second;
			for(auto i : cnt){
				divider.push_back(i.first);
			}
		}
	}

	int n;
	cin >> n;
	for(int i = 1; i <= n; i++){
		for(auto j : prime){
			dp[i][j] = 1e9;
		}
	}

	for(int i = 1; i <= n; i++){
		cin >> a[i];
		for(auto j : prime){
			if(a[i] % j == 0){
				point_div[i].push_back(j);
			}
		}
	}
	int u, v;
	for(int i = 0; i < n - 1; i++){
		cin >> u >> v;
		graph[u].push_back(v);
		graph[v].push_back(u);
	}

	cout << dfs(1) << '\n';
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 1ms
memory: 3660kb

input:

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

output:

-294967295

result:

wrong answer 1st lines differ - expected: '6', found: '-294967295'