码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-10-13 13:44:15      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:factor   max   actor   ble   lld   span   hdu   sizeof   red   

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

 

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

标签:factor   max   actor   ble   lld   span   hdu   sizeof   red   

原文地址:https://www.cnblogs.com/polya/p/9782540.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!