p1218 Superprime Rib

时间:2025-01-26 22:33:32

深搜,添加数字后如果仍为质数,继续递归。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <iomanip>
#include <cstring>
#include <map>
#include <queue>
#include <set>
#include <cassert>
#include <stack>
#define mkp make_pair
using namespace std;
const double EPS=1e-;
typedef long long lon;
const lon SZ=,INF=0x7FFFFFFF;
vector<int> pri,res;
bool isp[SZ]; bool isprime(int x)
{
for(int i=;i<pri.size();++i)
{
if(x!=pri[i]&&x%pri[i]==)return ;
}
return ;
} void dfs(int x,int n,int val)
{
if(x==n)
{
res.push_back(val);
return;
}
val*=;
for(int i=;i<;i+=)
{
val+=i;
if(isprime(val))
{
dfs(x+,n,val);
}
val-=i;
}
} void init()
{
memset(isp,,sizeof(isp));
isp[]=;
for(int i=;i*i<SZ;++i)
{
if(isp[i])
for(int j=i*i;j<SZ;j+=i)
{
isp[j]=;
}
}
for(int i=;i<SZ;++i)
{
if(isp[i])
{
pri.push_back(i);
}
}
} void work(int n)
{
init();
for(int i=;i<;++i)
{
dfs(,n,pri[i]);
}
} int main()
{
std::ios::sync_with_stdio();
//freopen("d:\\1.txt","r",stdin);
lon casenum;
//cin>>casenum;
//for(lon time=1;time<=casenum;++time)
{
int n;
cin>>n;
work(n);
for(int i=;i<res.size();++i)
{
cout<<res[i]<<endl;
}
}
return ;
}