zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    IOS UI NavigationController结构
    IOS UI 自定义navigationBar布局
    IOS UI 代码界面跳转常用方式
    IOS OC 多态(白话)
    IOS OC NSArray&NSMutableArray
    IOS OC NSString基础知识
    NSTimer做一个小计时器
    IOS UI 代码创建UIButton,UITextField,UILabel
    [HNOI2010]平面图判定
    [SDOI2017]树点涂色
  • 原文地址:https://www.cnblogs.com/shuaihui520/p/9982969.html
Copyright © 2011-2022 走看看