HDU 5942 Just a Math Problem 2016 杭州 CCPC 最大质数间隔777

#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int maxn=sqrt(2e9)+10;
int p[maxn];
void getprime()
{
    for(int i=2;i<maxn;i++)
    {
        if(!p[i])p[++p[0]]=i;
        for(int j=1;j<=p[0]&&p[j]<=maxn/i;j++)
        {
            p[p[j]*i]=1;
            if(i%p[j]==0) break;
        }
    }
}
vector<int> getfactor(LL x)
{
    vector<int>q;
    for(int i=1,t;i*i<=x;i++)
    if((t=x/i)*i==x){
        q.push_back(i);
        q.push_back(t);
    }
    return q;
}
const int maxm=800;
vector<LL>mp[maxm];
int linker[maxm];bool used[maxm];int un;
bool dfs(int u)
{
    for(int i=0,sz=mp[u].size();i<sz;i++)
    {
        int v=mp[u][i];
        if(!used[v]){
            used[v]=true;
            if(linker[v]==-1||dfs(linker[v])){
                linker[v]=u;
                return true;
            }
        }
    }
    return false;
}
int hungry()
{
    int res=0;
    memset(linker,-1,sizeof linker);
    for(int u=0;u<un;u++)
    {
        memset(used,false,sizeof used);
        if(dfs(u)) res++;
    }
    return res;
}
int tot=0;
unordered_map<int,int>idx;

inline int fnd(int x)
{
    if(idx.find(x)==idx.end()) idx[x]=tot++;
    return idx[x];
}
void addedge(int uu,int vv)
{
    int u=fnd(uu),v=fnd(vv);
    mp[u].push_back(v);
    mp[v].push_back(u);
}
int solve(LL l,LL r)
{
    tot=0;
    idx.clear();
    for(int i=l;i<=r;i++)
    {
        fnd(i);
    }
    un=r-l+1;
    for(int i=l;i<=r;i++)
    {
        vector<int> q=getfactor(i);
//        printf("%d :",i);
        for(auto &j:q){
            if(j>un)continue;
            addedge(i,j);
//            printf("%d ",j);
        }
//        printf("\n");
    }
    int res=hungry();
    for(int i=0;i<tot;i++)
        mp[i].clear();
//    printf("%d %d\n",res,un);
    return res!=un;
}
int main() {
    #ifdef shuaishuai
    freopen("in.txt","r",stdin);

    #endif //  shuaishuai
    int t;
    scanf("%d",&t);
//    getprime();
    for(int cas=1;cas<=t;cas++)
    {
        LL n,s;
        scanf("%lld%lld",&n,&s);
        LL l=max(n+1,s+1),r=n+s;
        int f=0;
        if(r-l+1>=777){
            f=1;
            printf("Case #%d: %s\n",cas,f? "No":"Yes");
            continue;
        }
        f=solve(l,r);
        printf("Case #%d: %s\n",cas,f? "No":"Yes");
    }
    return 0;
}

 

posted @ 2018-10-13 12:46  BIack_Cat  阅读(222)  评论(0编辑  收藏  举报