这道题关键在于:如果区间内有两个以上的素数,那么答案一定是No;
否则的话我们要暴力的找。
如果知道1e9范围内的相邻素数最远不会超过300的话这道题就好做了。
对于大于300的区间一定存在两个素数直接输出No。
否则我们就暴力的用二分图匹配找到答案。
题目地址
#include<bits/stdc++.h>
using namespace std;
int mp[500][500], ans[500], used[500];
int T = 0;
bool find(int x, int n) {
for(int i = 1; i <= n; i++) {
if(mp[x][i] && !used[i]) {
used[i] = 1;
if(ans[i] == 0|| find(ans[i], n)) {
ans[i] = x;
return true;
}
}
}
return false;
}
int cal(int n) {
int res = 0;
memset(ans, 0, sizeof(ans));
for(int i = 1; i <= n; i++) {
memset(used, 0, sizeof(used));
if(find(i, n)) res++;
}
return res;
}
void solve() {
int n, s;
scanf("%d%d", &n, &s);
if(s < n) swap(n, s);
memset(mp, 0, sizeof(mp));
if(n > 300) {printf("Case #%d: No\n", ++T);return;}
for(int i = s+1; i <= s+n; i++) {
for(int j = 1; j <= n; j++) {
if(i%j==0) mp[i-s][j] = 1;
}
}
printf("Case #%d: %s\n", ++T, cal(n)==n?"Yes":"No");
}
int main() {
int Case;
scanf("%d", &Case);
while(Case--) {
solve();
}
}