2016CCPC杭州 K - Kingdom of Obsession [HDU - 5943]

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/z591826160/article/details/83267963

K - Kingdom of Obsession [HDU - 5943]

题面

在这里插入图片描述

思路

拿到题目大胆猜想,区间内出现两个素数的会有问题,考虑之后发现当s很小而n很大的时候可能允许出现多个素数(多个素数站在原本的位置)
而考虑当 n s + 1 n \ge s+1 区间 [ n , s + 1 ] [n,s+1] 内的值站在自己原本的地方一定是最优,因为是他倍数的数可使用的因子更多
因此可以将第一个推论完善,这样区间出现两个素数必然是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);
    }
}

猜你喜欢

转载自blog.csdn.net/z591826160/article/details/83267963