题意:
- 定义一个数为"Supreme Number"当且仅当 这个数本身是素数以及它数位组成的子序列也是素数
- 比如:17 1,7, 17都是素数所以 17满足题意
- 现在给你一个N,让你输出不超过N 的最大 "Supreme Number"
做法:
- 首先,由子序列也是素数就确保了答案里面不存在重复的数位,比如373
- 所以最大的范围就是1e8,因为1~9 9个数嘛~
- 所以我们打个1e4的素数表,然后暴力打个表就可以,把每个素数的数位通过枚举子集组合
打表代码:
#include<bits/stdc++.h>
#define IO ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define pb(x) push_back(x)
#define sz(x) (int)(x).size()
#define sc(x) scanf("%d",&x)
#define pr(x) printf("%d\n",x)
#define abs(x) ((x)<0?-(x):x)
#define all(x) x.begin(),x.end()
using namespace std;
typedef long long ll;
const int mod = 1e9+7;
const double PI = 4*atan(1.0);
const int maxm = 1e8+5;
const int maxn = 1e5+5;
const int INF = 0x3f3f3f3f;
int prime[maxn];
bool isprime[maxn];
int tot;
void prime_table()
{
memset(isprime,true,sizeof(isprime));
isprime[0] = false;
for(ll i=2;i<maxn;i++)
{
if(isprime[i]){
prime[tot++] = i;
for(ll j=i*i;j<maxn;j+=i)
isprime[j] = false;
}
}
}
vector<int> fac[maxn];
void dec(int n)
{
int tmp = n;
int k = 0;
int a[15];
while(n)
{
a[k++] = n%10;
n/=10;
}
reverse(a,a+k);
for(int i=0;i<k;i++)
fac[tmp].push_back(a[i]);
}
int main()
{
#ifdef LOCAL_FILE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif // LOCAL_FILE
prime_table();
for(int i=0;i<tot;i++)
{
dec(prime[i]);
}
for(int i=0;i<tot;i++)
{
int sum = 0;
for(int s=1;s<(1<<fac[prime[i]].size());s++)
{
int res = 0;
for(int j=0;j<(int)fac[prime[i]].size();j++)
{
if(s&(1<<j))
{
res = res*10+fac[prime[i]][j];
}
}
if(isprime[res]) sum++;
}
if(sum+1 == pow(2,(int)fac[prime[i]].size())) cout<<prime[i]<<",";
}
return 0;
}
AC代码:
#include<bits/stdc++.h>
#define IO ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define pb(x) push_back(x)
#define sz(x) (int)(x).size()
#define sc(x) scanf("%d",&x)
#define pr(x) printf("%d\n",x)
#define abs(x) ((x)<0?-(x):x)
#define all(x) x.begin(),x.end()
using namespace std;
typedef long long ll;
const int mod = 1e9+7;
const double PI = 4*atan(1.0);
const int maxm = 1e8+5;
const int maxn = 1e4+5;
const int INF = 0x3f3f3f3f;
int a[19] = {2,3,5,7,11,13,17,23,31,37,53,71,73,113,131,137,173,311,317}; //表
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
#ifdef LOCAL_FILE
freopen("in.txt","r",stdin);
#endif // LOCAL
IO;
int t;
int idx=1;
cin>>t;
sort(a,a+19,cmp);
while (t--)
{
char s[1005];
cin >> s;
int ans;
if (strlen(s) >=4)
ans = 317;
else {
int x;
sscanf(s,"%d",&x);
int pos = lower_bound(a,a+19,x,greater<int>())-a;
ans = a[pos];
}
cout<<"Case #"<<idx++<<": "<<ans<<endl;
}
return 0;
}