80pts悬关求条
查看原帖
80pts悬关求条
767155
a_small_penguin楼主2025/1/26 16:46

code:

#include<bits/stdc++.h>
using namespace std;

#define PII pair<int, int>

int n, m;
int l[109];
int gcd;
int s = 114514;
int dis[4009];
bitset<4009> st;
priority_queue<PII, vector<PII>, greater<PII> > p;

void dij() {
	memset(dis, 0x7f, sizeof(dis));
	dis[0] = 0;
	p.push({0, 0});
	while(p.size()) {
		int u = p.top().second;
		p.pop();
		if(st[u]) continue;
		st[u] = 1;
		for(int i = 2; i <= 4000; i++) {
			if(!st[i]) continue;
			int v = (u + i) % s, d = i;
			if(dis[v] > dis[u] + d) {
				 dis[v] = dis[u] + d;
				 p.push({dis[v], v});
			}
		}
		
	}
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    
    cin >> n >> m;
    
    for(int i = 1; i <= n; i++){
    	cin >> l[i];
    	gcd = __gcd(gcd, l[i]);
    	for(int j = 0; j <= m && j < l[i]; j++) st[l[i] - j] = 1,gcd = __gcd(l[i] - j, gcd), s = min(s, l[i] - j);
    	if(l[i] - m <= 1) {
    		cout << -1;
    		return 0;
    	}
    }
    if(gcd > 1)  {
    	cout << -1;
    	return 0;
    }
    
    dij();
    
    int ans = -1;
    for(int i = 1; i < s; i++) {
    	ans = max(ans, dis[i] - s);
    }
    cout << ans;
    
    return 0;
}


2025/1/26 16:46
加载中...