題目鏈接: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;
}