1. 程式人生 > >HDU 5942 Just a Math Problem 2016 杭州 CCPC 最大質數間隔777

HDU 5942 Just a Math Problem 2016 杭州 CCPC 最大質數間隔777

cto sizeof false map ++ spa turn dfs order

#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