版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/z591826160/article/details/83267963
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);
}
}