emirp反素数

#include<bits/stdc++.h>
using namespace std;
long long n;
long long ans;
long long prime[3000010];
bool is_no_p[3000010];
long long maxx;
void Prime()
{
	long long n=1000;
	for (long long i=2;i<=n;i++)
	{
		if (!is_no_p[i]) prime[++prime[0]]=i;
		for (long long j=1;j<=prime[0] && i*prime[j]<=n;j++)
		{
			is_no_p[i*prime[j]]=1;
			if (i%prime[j] == 0) break;
		}
	}
}
long long ksm(long long x,long long y)
{
	long long cnt=1;
	while(y)
	{
		if (y&1) cnt*=x;
		x*=x;
		y>>=1;
	}
	return cnt;
}
void dfs(long long x,long long num,long long id,__int128 sum)
{
	if(id>maxx || (id == maxx && x<ans))
	{
		ans=x;
		maxx=id;
	}
	long long k=x;
	for (int i=1;i<=sum;i++)
	{
		if (n/k<prime[num]) return;
		k*=prime[num];
		if (k<=n) dfs(k,num+1,id*(i+1),i);
	}
}
inline void read(long long &x)
{
	char ch=getchar();long long f=1;x=0;
	while(!isdigit(ch) && ch^'-') ch=getchar();
	if(ch=='-') f=-1,ch=getchar();
	while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
	x*=f;
}
inline void write(long long x)
{
	if(x<0)x*=-1,putchar('-');
	if(x>9)write(x/10);
	putchar(x%10+'0');
	return;
}
int main()
{
	Prime();
	read(n);
	dfs(1,1,1,30);
	cout << ans << endl;
    return 0;
}
posted @ 2026-04-12 09:25  msjing  阅读(8)  评论(0)    收藏  举报