HDU 5938 Kingdom of Obsession(数论 + 二分图匹配)

题意:

给定S,N,把S+1,S+2,...S+N这N个数填到1,2,...,N里,要求X只能填到X的因子的位置。(即X%Y=0,那么X才能放在Y位置)

 问是否能够放满。

分析:经过小队的分析得出的结论是如果S+1,S+2,...S+N有两个素数就肯定是不行的对吧 ,虽然素数可以取本身当如果素数可以取到本身s=0||s=1 , 前面可以特判出来 , 所以可以估算一下素数的最大间隔(我取504),N超过必然无解。N小于504的情况下,直接暴力建边(能整除就连边),然后跑二分图匹配即可。

网上有片博客是说到素数的间隔最大为246

//
//by coolxxx
//#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<iomanip>
#include<map>
#include<stack>
#include<queue>
#include<set>
#include<bitset>
#include<memory.h>
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//#include<stdbool.h>
#include<math.h>
#pragma comment(linker,"/STACK:1024000000,1024000000")
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
#define abs(a) ((a)>0?(a):(-(a)))
#define lowbit(a) (a&(-a))
#define sqr(a) ((a)*(a))
#define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
#define mem(a,b) memset(a,b,sizeof(a))
#define eps (1e-8)
#define J 10000
#define mod 1000000007
#define MAX 0x7f7f7f7f
#define PI 3.14159265358979323
#define N 1004
#define M 504
using namespace std;
typedef long long LL;
double anss;
LL aans;
int cas,cass;
int n,m,lll,ans;
int s;
int last[N],mark[N];
bool u[N];
struct xxx
{
    int next,to;
}a[M*M];
void add(int x,int y)
{
    a[++lll].next=last[x];
    a[lll].to=y;
    last[x]=lll;
}
bool dfs(int now)
{
    int i,to;
    for(i=last[now];i;i=a[i].next)
    {
        to=a[i].to;
        if(!u[to])
        {
            u[to]=1;
            if(!mark[to] || dfs(mark[to]))
            {
                mark[to]=now;
                return 1;
            }
        }
    }
    return 0;
}
int main()
{
    #ifndef ONLINE_JUDGEW
//    freopen("1.txt","r",stdin);
//    freopen("2.txt","w",stdout);
    #endif
    int i,j,k;
    int x,y,z;
//    init();
//    for(scanf("%d",&cass);cass;cass--)
    for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
//    while(~scanf("%s",s))
//    while(~scanf("%d%d",&n,&m))
    {
        lll=0;ans=0;mem(last,0);mem(mark,0);
        
        printf("Case #%d: ",cass);
        
        scanf("%d%d",&s,&n);
        if(s<n)swap(n,s);
        if(n>M){puts("No");continue;}
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=n;j++)
                if((s+i)%j==0)
                {
                    add(j,i+n);
                }
        }
        for(i=1;i<=n;i++)
        {
            mem(u,0);
            if(dfs(i))ans++;
        }
        if(ans==n)puts("Yes");
        else puts("No");
    }
    return 0;
}
/*
//
//
*/
View Code
原文地址:https://www.cnblogs.com/shuaihui520/p/9982969.html