想定解じゃなかった…。
https://yukicoder.me/problems/no/3485
問題
整数nが495 likeであるというのは、奇素数a,b,cを用いてn = a^2*b*cと表せるものをいう。
正整数L,Rが与えられるので、[L,R]の間に495 likeな整数が1つでもあればそれを答えよ。
解法
a,bを総当たりする。
L'=ceil(L/(a^2*b))、R'=floor(R/(a^2*b))とすると、[max(b+1,L'),R']の間に奇素数cがあればよいことになる。
これはミラーラビン法で確認すればよい。
const int prime_max = 10101010; vector<ll> prime; int NP,divp[prime_max]; void cprime() { if(NP) return; for(int i=2;i<prime_max;i++) if(divp[i]==0) { //M[i]=NP; prime.push_back(i); NP++; for(ll j=1LL*i*i;j>=i&&j<prime_max;j+=i) if(divp[j]==0) divp[j]=i; } } ll modpow(__int128_t a, ll n, ll mo) { __int128_t r=1; a%=mo; while(n) r=r*((n%2)?a:1)%mo,a=a*a%mo,n>>=1; return r; } bool MillerRabin(ll v,int loop=10) { ll d=v-1; int s=0,i,j; if(v<=1) return false; if(v==2) return true; if(v%2==0) return false; while(d%2==0) d/=2,s++; FOR(i,loop) { ll a=abs(rand()*rand()+rand())%(v-2)+1; ll r=modpow(a,d,v); if(r==1 || r==v-1) continue; FOR(j,s) { r=modpow(r,2,v); if(r==v-1) break; } if(j==s) return false; } return true; } ll L,R; void solve() { int i,j,k,l,r,x,y; string s; cprime(); cin>>L>>R; for(i=1;i<NP;i++) { ll x=prime[i]; if(x*x*x*x>R) break; for(j=i+1;j<NP;j++) { ll y=prime[j]; if(x*x*y*y>R) break; ll L2=max((L+(x*x*y-1))/(x*x*y),prime[j+1]); ll R2=R/(x*x*y); for(ll v=L2;v<=R2;v++) { if(MillerRabin(v,10)) { cout<<x*x*y*v<<endl; return; } } } } cout<<-1<<endl; }
まとめ
久々にミラーラビン使った気がする。