hdu 5943(素数间隔+二分图匹配)

Kingdom of Obsession

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 200    Accepted Submission(s): 64

Problem Description

There is a kindom of obsession, so people in this kingdom do things very strictly.

They name themselves in integer, and there are n people with their id continuous (s+1,s+2,?,s+n) standing in a line in arbitrary order, be more obsessively, people with id x wants to stand at yth position which satisfy

xmody=0

Is there any way to satisfy everyone‘s requirement?

Input

First line contains an integer T, which indicates the number of test cases.

Every test case contains one line with two integers n, s.

Limits
1≤T≤100.
1≤n≤109.
0≤s≤109.

Output

For every test case, you should output ‘Case #x: y‘, where x indicates the case number and counts from 1 and y is the result string.

If there is any way to satisfy everyone‘s requirement, y equals ‘Yes‘, otherwise y equals ‘No‘.

Sample Input

2
5 14
4 11

Sample Output

Case #1: No
Case #2: Yes

Source

2016年中国大学生程序设计竞赛(杭州)

这个题比赛的时候想到了素数出现两次就不能匹配,但是没想到素数间隔(潜意识认为20亿以内的素数肯定间隔很大).

20亿内两个素数之间最大间隔不会超过300,所以超过600直接输出No.所以解法就是小数据二分图匹配,大数据直接输出No.防止区间相交,要特判一下n,s的大小.

#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <math.h>
using namespace std;
typedef long long LL;
const int N = 2016;
int s,n;
int graph[N][N];
int linker[N];
bool vis[N];
bool dfs(int u){
    for(int i=1;i<=n;i++){
        if(graph[u][i]==1&&!vis[i]){
            vis[i] = true;
            if(linker[i]==-1||dfs(linker[i])){
                linker[i] = u;
                return true;
            }
        }
    }
    return false;
}
int main()
{
    int t = 1,tcase;
    scanf("%d",&tcase);
    while(tcase--){
        scanf("%d%d",&s,&n);
        if(s<n) swap(s,n);
        if(n>1000) {
            printf("Case #%d: No\n",t++);
            continue;
        }
        memset(graph,0,sizeof(graph));
        int res = 0;
        for(int i=1;i<=n;i++){
            int t = i+s;
            for(int j=1;j<=n;j++){
                if(t%j==0) {
                    graph[i][j] = 1;
                }
            }
        }
        memset(linker,-1,sizeof(linker));
        for(int i=1;i<=n;i++){
            memset(vis,0,sizeof(vis));
            if(dfs(i)) res++;
        }
        if(res==n){
            printf("Case #%d: Yes\n",t++);
        }else printf("Case #%d: No\n",t++);
    }
    return 0;
}
时间: 2024-10-20 22:45:20

hdu 5943(素数间隔+二分图匹配)的相关文章

csu 1552(米勒拉宾素数测试+二分图匹配)

1552: Friends Time Limit: 3 Sec  Memory Limit: 256 MBSubmit: 723  Solved: 198[Submit][Status][Web Board] Description On an alien planet, every extraterrestrial is born with a number. If the sum of two numbers is a prime number, then two extraterrestr

HDU 1083 网络流之二分图匹配

http://acm.hdu.edu.cn/showproblem.php?pid=1083 二分图匹配用得很多 这道题只需要简化的二分匹配 #include<iostream> #include<cstdio> #include<cstring> #define maxm 410 using namespace std; int p,n; int master[maxm]; int linking[maxm][maxm]; int has[maxm]; int sol

hdu 5093 Battle ships 二分图匹配

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5093 一开始就往贪心的方向想了结果wa全场 这种矩阵形式的图一般要联想到行和列构成了二分图 然后实质就是求一个最大匹配 中间的冰山实际上就是把一行或一列切成多个顶点而已 所以一开始预处理一下 然后就可以套用模板 #include <cstring> #include <cstdlib> #include <cstring> #include <cmath> #i

hdu - 1150 Machine Schedule (二分图匹配最小点覆盖)

http://acm.hdu.edu.cn/showproblem.php?pid=1150 有两种机器,A机器有n种模式,B机器有m种模式,现在有k个任务需要执行,没切换一个任务机器就需要重启一次, 如果任务i在机器A上执行,A机器需要一个对应的模式A,如果在机器B上执行,机器A需要一个模式B. 一直就是机器A在切换模式,现在让你安排一种合理的任务执行顺序,让机器重启次数最少. 每个任务之间连一条边.二分图的最小顶点覆盖就是求最少的点可以连接所有的边,然后转化成最大匹配即可. 这题就是初始状态

hdu 2819 Swap(二分图匹配)

hdu 2819 Swap Description Given an N*N matrix with each entry equal to 0 or 1. You can swap any two rows or any two columns. Can you find a way to make all the diagonal entries equal to 1? Input There are several test cases in the input. The first li

HDU 2819 隐式二分图匹配

http://acm.hdu.edu.cn/showproblem.php?pid=2819 这道题乍一看是矩阵变换题,估计用矩阵之类的也可以做 但是分析一下就可以知道 要凑成对角线都是1,题目允许行变换和列变换 然而观察可以得知如果可以完成只需要行变换或者列变换之一即可 donser[i][j]=1表示i,j位置有1,那么只需要变换j到i(即交换i,j行) 输出中间过程用queue 加上dfs遍历即可 #include<iostream> #include<cstdio> #in

hdu 1150 Machine Schedule (二分图匹配)

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n,m,k; int mat[110][110]; int link[110]; int vis[110]; bool find(int u) { int v; for(v=0;v<m;j++) if(g[u][v]&&!vis[v]) {

HDU 5943 Kingdom of Obsession 【二分图匹配 匈牙利算法】 (2016年中国大学生程序设计竞赛(杭州))

Kingdom of Obsession Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 49    Accepted Submission(s): 14 Problem Description There is a kindom of obsession, so people in this kingdom do things very

HDU 5943 Kingdom of Obsession 二分图的匹配

题目链接→戳 s,n 1e9的范围直接暴力匹配二分图肯定会T... 对于区间[1,n]和[s+1,s+n],如果存在重叠部分, 比如1,2,3......,n-2,   n-1 ,  n ↓      ↓      ↓ s+1,s+2,s+3......s+n s+1,s+2,s+2直接放在s+1,s+2,s+3的位置,只需要去匹配[1,s]和[n,s+n] 这样,我们需要去匹配的区间内就没有s+i可以放在s+i位置的了,如果区间内存在>=2个素数,这些素数只能放在第一个位置,这种情况肯定是No