题意:
给定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; } /* // // */