[jzoj 3188] 找数 {数论/卡常}

版权声明:~~~感谢支持! https://blog.csdn.net/qq_39897867/article/details/89060424

题目


解题思路

[题解]~~~~
[卡常]https://blog.csdn.net/xuxiayang/article/details/89000258


代码

#include<cstdio>
#include<algorithm>
#define ll long long 
#define rep(i,x,y,z) for (register long long i=x;i<=y;i+=z)
using namespace std; 
const ll inf=1e9; 
ll ant,prime[30001],m,n,p,v[32501]; bool f; 
signed main(){
	scanf("%lld%lld",&n,&p); 
	if (n==1) return 0&printf("%lld",p); else 
	if (n>1&&p*p>inf) return 0&printf("0"); else n--;
	rep(i,2,32500,1) {		 	
		if (!v[i]) v[i]=i,prime[++m]=i; 
		rep(j,1,m,1){
			if (prime[j]>v[i]||prime[j]>32500/i) break; 
			v[i*prime[j]]=prime[j]; 
		}
	}
	if (p==2) {
		if (2*n+2<=inf) return 0&printf("%lld",2*n+2); 
	} else if (p==3){
		if (6*n+3<=inf) return 0&printf("%lld",6*n+3); 
	} else if (p==5){
		rep(i,p*p,inf,10) 
			if (i%3) if (!--n) return 0&printf("%lld",i); 		
	} else if (p==7){
		rep(i,p*p,inf,14) 
			if ((i%3)&&(i%5)) if (!--n) return 0&printf("%lld",i); 		
	} else if (p==11){
		rep(i,p*p,inf,22) 
			if ((i%3)&&(i%5)&&(i%7)) if (!--n) return 0&printf("%lld",i); 		
	} else if (p==13){
		rep(i,p*p,inf,26) 
			if ((i%3)&&(i%5)&&(i%7)&&(i%11)) if (!--n) return 0&printf("%lld",i); 		
	} else if (p==17){
		rep(i,p*p,inf,34) 
			if ((i%3)&&(i%5)&&(i%7)&&(i%11)&&(i%13)) if (!--n) return 0&printf("%lld",i); 		
	} else {
		ant=lower_bound(prime+1,prime+1+m,p)-prime-1; 
	    rep(i,p*p,inf,2*p){
		f=0; rep(j,1,ant,1) if (i%prime[j]==0) {f=1;break;}
		if (f==0) if (!--n) return 0&printf("%lld",i); 		
		}
	}
	return 0&putchar('0'); 			
}

猜你喜欢

转载自blog.csdn.net/qq_39897867/article/details/89060424