Sums

題目鏈接:Sums


我們讓a[1]爲模數,然後用a[2]->a[n]來構造%a[1]的每個數的最小值。

然後直接看d[x%a[1]]<=x,那麼就是有解的。


AC代碼:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=5e4+10;
int n,a[N],d[N],m,vis[N];
void Dijkstra(){
	priority_queue<pair<int,int> > q; memset(d,0x3f,sizeof d); d[0]=0; q.push({0,0});
	while(q.size()){
		int u=q.top().second; q.pop();
		if(vis[u])	continue;	vis[u]=1;
		for(int i=2;i<=n;i++) if(d[(a[i]+u)%a[1]]>d[u]+a[i]){
			d[(a[i]+u)%a[1]]=d[u]+a[i]; q.push({-d[(a[i]+u)%a[1]],(a[i]+u)%a[1]});
		}
	}
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++)	cin>>a[i];
	Dijkstra();	cin>>m;
	for(int i=1,x;i<=m;i++)	cin>>x,puts((d[x%a[1]]<=x)?"TAK":"NIE");
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章