题目链接:点击查看
题意:给你s,n,要求给s+1,s+2...s+n,这n个数编号1-n,满足每个数膜编号为0,问是否存在
题解:打表发现两个素数的差值不足300,我们可以发现素数的因子只有1和他们本身,当n>s时,两个区间有交集,我们让这些数的编号为他们自己即可,而剩余的数怎么操作呢,我们交换s,n,即可(当s<n时),当时我还纳闷直接匹配不就行了,这样是不行的,因为我们在判断n的时候给了个定值判断,比如s=1,n=100000000,这种情况也是合适的,像这种情况我们直接判断100000000 1就行了
#include<iostream>
#include<cstdio>
#include<cmath>
#include<vector>
using namespace std;
typedef long long ll;
int match[810],vis[810];
int mp[810][810];
int n,s;
int dfs(int u)
{
for(int i=1;i<=n;i++)
{
if(mp[u][i]==0 || vis[i]) continue;
vis[i]=1;
if(match[i]==-1 || dfs(match[i]))
{
match[i]=u;
return 1;
}
}
return 0;
}
int main()
{
// int maxx=-1;
// len=1;
// for(int i=2;i<=100000000;i++)
// {
// if(!ok[i]) prime[len++]=i,maxx=max(maxx,prime[len-1]-prime[len-2]);
// for(int j=1;j<len&&(ll)prime[j]*i<=100000000;j++)
// {
// ok[i*prime[j]]=1;
// if(i%prime[j]==0) break;
// }
// }
// cout<<maxx<<endl;
int T;
int nn=1;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&s);
printf("Case #%d: ",nn++);
if(s<n) swap(s,n);
if(n>=300)
{
printf("No\n");
continue;
}
for(int i=0;i<=n;i++) match[i]=-1,vis[i]=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if((s+i)%j==0) mp[i][j]=1;
else mp[i][j]=0;
}
}
int flag=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++) vis[j]=0;
if(!dfs(i))
{
flag=0;
break;
}
}
printf(flag?"Yes\n":"No\n");
}
return 0;
}