2016CCPC杭州 K - Kingdom of Obsession [HDU - 5943]
阿新 • • 發佈:2018-11-22
K - Kingdom of Obsession [HDU - 5943]
題面
思路
拿到題目大膽猜想,區間內出現兩個素數的會有問題,考慮之後發現當s很小而n很大的時候可能允許出現多個素數(多個素數站在原本的位置)
而考慮當
區間
內的值站在自己原本的地方一定是最優,因為是他倍數的數可使用的因子更多
因此可以將第一個推論完善,這樣區間出現兩個素數必然是No,而考慮2e9範圍內的相鄰兩素數差不會很大,剩下的就是跑二分圖完美匹配即可
程式碼
int vis[maxn],mat[maxn];
vector<int> G[maxn];
bool dfs(int x,int now ) {
for (int i=0;i<G[x].size();i++) {
int y=G[x][i];
if (vis[y]==now) continue ;
vis[y]=now;
if (mat[y]==-1||dfs(mat[y],now)) {
mat[y]=x;
return 1;
}
}
return 0;
}
void pei(ll n,ll s){
memset(mat,-1,sizeof(mat));
memset(vis,0,sizeof(vis));
for (ll i=s+1;i<=s+n;i++) {
G[i-s].clear();
for (int j=1;j<=n;j++) {
if (i%j==0) G[i-s].push_back(j);
}
}
ll ans=0;
ll now=0;
for (ll i=s+1;i<=s+n;i++) {
now++;
if (dfs(i-s,now)) ans++;
}
ans==n?puts("Yes"):puts("No");
}
int main() {
int t;
rd(t);
int cas=0;
while(t--){
ll n,s;
rd(n,s);
printf("Case #%d: ",++cas);
if(s+1<=n)swap(n,s);
if(n>=1000)
puts("No");
else pei(n,s);
}
}