• hdu 5943 Kingdom of Obsession 二分图匹配+素数定理


    Kingdom of Obsession

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)


    Problem Description
    There is a kindom of obsession, so people in this kingdom do things very strictly.

    They name themselves in integer, and there are n people with their id continuous (s+1,s+2,,s+n) standing in a line in arbitrary order, be more obsessively, people with id x wants to stand at yth position which satisfy

    xmody=0


    Is there any way to satisfy everyone's requirement?
     
    Input
    First line contains an integer T , which indicates the number of test cases.

    Every test case contains one line with two integers n , s .

    Limits
    1T100 .
    1n109 .
    0s109 .
     
    Output
    For every test case, you should output 'Case #x: y', where x indicates the case number and counts from 1 and y is the result string.

    If there is any way to satisfy everyone's requirement, y equals 'Yes', otherwise y equals 'No'.
     
    Sample Input
    2 5 14 4 11
     
    Sample Output
    Case #1: No Case #2: Yes
     
    Source
    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define pi (4*atan(1.0))
    #define eps 1e-14
    const int N=2e5+10,M=1e6+10,inf=1e9+10,mod=1e9+7;
    const ll INF=1e18+10;
    int prime(int n)
    {
        if(n<=1)return 0;
        if(n==2)return 1;
        if(n%2==0)return 0;
        int k, upperBound=n/2;
        for(k=3; k<=upperBound; k+=2)
        {
            upperBound=n/k;
            if(n%k==0)return 0;
        }
        return 1;
    }
    const int MAXN=1505;
    map<int,int>linker;
    map<int,int>used;
    vector<int>mp[MAXN];
    int uN;
    bool dfs(int u)
    {
        for(int i=0;i<mp[u].size();i++)
        {
            if(!used[mp[u][i]])
            {
                used[mp[u][i]]=1;
                if(linker[mp[u][i]]==0||dfs(linker[mp[u][i]]))
                {
                    linker[mp[u][i]]=u;
                    return true;
                }
            }
        }
        return false;
    }
    int hungary()
    {
        int u;
        int res=0;
        linker.clear();
        for(u=1;u<=uN;u++)
        {
            used.clear();
            if(dfs(u)) res++;
        }
        return res;
    }
    int main()
    {
        int T,cas=1;
        scanf("%d",&T);
        while(T--)
        {
            for(int i=0;i<MAXN;i++)
               mp[i].clear();
            int n,s;
            scanf("%d%d",&n,&s);
            if(n>s)swap(n,s);
            int p=0;
            for(int i=s+1; i<=s+n; i++)
            {
                if(prime(i))
                {
                    p++;
                    if(p>=2)break;
                }
            }
            printf("Case #%d: ",cas++);
            if(p>=2)
            {
                printf("No
    ");
                continue;
            }
            for(int i=s+1; i<=s+n; i++)
            {
                for(int j=1; j<=n; j++)
                {
                    if(i%j==0)
                    {
                        mp[j].push_back(i);
                    }
                }
            }
            uN=n;
            int hh=hungary();
            if(hh==n)
                printf("Yes
    ");
            else
                printf("No
    ");
        }
        return 0;
    }

     

  • 相关阅读:
    【Linux学习三】Linux系统目录架构
    【Linux学习二】Linux文件系统
    【Python网络爬虫四】通过关键字爬取多张百度图片的图片
    【GitHub】命令行操作
    【Linux学习一】命令行CLI、BASH的基本操作
    从CK+库提取标记点信息
    【Python网络爬虫三】 爬取网页新闻
    Windows命令行下pip安装python whl包
    【GitHub Desktop】MacOS和Win下配置及简单的使用
    【Python文件处理】递归批处理文件夹子目录内所有txt数据
  • 原文地址:https://www.cnblogs.com/jhz033/p/6011571.html
Copyright © 2020-2023  润新知