1. 程式人生 > >2016CCPC杭州 K - Kingdom of Obsession [HDU - 5943]

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

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); } }