#include <stdio.h>
#include <stdlib.h>
#include <math.h>
// quick sieve primes below n
int sieve(int n,int**p,int*l){
if(n<2) return -1;
else if(n==2){
*l=1;
*p
=(int*)malloc(*l
*sizeof(int)); (*p)[0]=2;
return 0;
}
int tmpl=(n+1-3+1)/2;
int *s
=(int*)malloc(tmpl
*sizeof(int)); int i=0,m=3,j,h=(n+1)/2-1;
for(;i<tmpl;i++) s[i]=3+2*i;
i=0;
while(m<=mr){
if(s[i]){
j=(m*m-3)/2;
s[j]=0;
while(j<h){
s[j]=0;
j+=m;
}
}
i++;
m=2*i+3;
}
h=1;
for(i=0;i<tmpl;i++) if(s[i]) h++;
*p
=(int*)malloc(h
*sizeof(int)); (*p)[0]=2;
h=1;
for(i=0;i<tmpl;i++)
if(s[i]) (*p)[h++]=s[i];
*l=h;
return 0;
}
// test for primality
int ispr(int n){
if(n%2==0) return 0;
int d=3;
while(d<m){
if(n%d==0)return 0;
d+=2;
}
return 1;
}
int digits(int n){
}
int pow_10[]={1,10,100,1000,10000};
// test if n can form prime with numbers from l
int test(int*l,int ll,int n){
int i=0,y,yd,nd=digits(n);
for(;i<ll;i++){
y=l[i];
yd=digits(y);
if(!(ispr(y*pow_10[nd]+n)&&ispr(n*pow_10[yd]+y)))
return 0;
}
return 1;
}
int main() {
int *pr=NULL,N=0;
sieve(10000,&pr,&N);
#define K 5
int l[K];
int i=0,c[K]={0},cf[K]={N-K+1,N-K+2,N-K+3,N-K+4,N-K+5};
for(i=1;i<K;i++)c[i]=-1;
i=c[0]=0;
while(1){
// jump out of the loop?
if(!(c[i]<cf[i])){
if(i==0){
break;
}
c[i]=-1;
i-=1;
c[i]+=1;
continue;
}
// init loop?
if(c[i]==-1){
c[i]=c[i-1]+1;
}
l[i]=pr[c[i]];
// start new loop
if(i==0 || test(l,i,pr[c[i]])){
i+=1;
if(i==K){
// most inner loop body
printf("%d %d %d %d %d (%d)\n",l
[0],l
[1],l
[2],l
[3],l
[4],l
[0]+l
[1]+l
[2]+l
[3]+l
[4]); break;
}
}else{
c[i]+=1;
}
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPG1hdGguaD4KCi8vIHF1aWNrIHNpZXZlIHByaW1lcyBiZWxvdyBuCmludCBzaWV2ZShpbnQgbixpbnQqKnAsaW50KmwpewogaWYobjwyKSByZXR1cm4gLTE7CiBlbHNlIGlmKG49PTIpewogICpsPTE7CiAgKnA9KGludCopbWFsbG9jKCpsKnNpemVvZihpbnQpKTsKICAoKnApWzBdPTI7CiAgcmV0dXJuIDA7CiB9CiBpbnQgdG1wbD0obisxLTMrMSkvMjsKIGludCAqcz0oaW50KiltYWxsb2ModG1wbCpzaXplb2YoaW50KSk7CiBkb3VibGUgbXI9c3FydChuKTsKIGludCBpPTAsbT0zLGosaD0obisxKS8yLTE7CiBmb3IoO2k8dG1wbDtpKyspIHNbaV09MysyKmk7CiBpPTA7CiB3aGlsZShtPD1tcil7CiAgaWYoc1tpXSl7CiAgIGo9KG0qbS0zKS8yOwogICBzW2pdPTA7CiAgIHdoaWxlKGo8aCl7CiAgICBzW2pdPTA7CiAgICBqKz1tOwogICB9CiAgfQogIGkrKzsKICBtPTIqaSszOwogfQogaD0xOwogZm9yKGk9MDtpPHRtcGw7aSsrKSBpZihzW2ldKSBoKys7CiAqcD0oaW50KiltYWxsb2MoaCpzaXplb2YoaW50KSk7CiAoKnApWzBdPTI7CiBoPTE7CiBmb3IoaT0wO2k8dG1wbDtpKyspCiAgaWYoc1tpXSkgKCpwKVtoKytdPXNbaV07CiBmcmVlKHMpOwogKmw9aDsKIHJldHVybiAwOwp9CgovLyB0ZXN0IGZvciBwcmltYWxpdHkKaW50IGlzcHIoaW50IG4pewogZG91YmxlIG09MStzcXJ0KG4pOwogaWYobiUyPT0wKSByZXR1cm4gMDsKIGludCBkPTM7CiB3aGlsZShkPG0pewogIGlmKG4lZD09MClyZXR1cm4gMDsKICBkKz0yOwogfQogcmV0dXJuIDE7Cn0KCmludCBkaWdpdHMoaW50IG4pewogcmV0dXJuIChpbnQpKDErZmxvb3IobG9nKG4pL2xvZygxMCkpKTsKfQogCmludCBwb3dfMTBbXT17MSwxMCwxMDAsMTAwMCwxMDAwMH07CgovLyB0ZXN0IGlmIG4gY2FuIGZvcm0gcHJpbWUgd2l0aCBudW1iZXJzIGZyb20gbAppbnQgdGVzdChpbnQqbCxpbnQgbGwsaW50IG4pewogaW50IGk9MCx5LHlkLG5kPWRpZ2l0cyhuKTsKIGZvcig7aTxsbDtpKyspewogIHk9bFtpXTsKICB5ZD1kaWdpdHMoeSk7CiAgaWYoIShpc3ByKHkqcG93XzEwW25kXStuKSYmaXNwcihuKnBvd18xMFt5ZF0reSkpKQogICByZXR1cm4gMDsKIH0KIHJldHVybiAxOwp9CgppbnQgbWFpbigpIHsKIGludCAqcHI9TlVMTCxOPTA7CiBzaWV2ZSgxMDAwMCwmcHIsJk4pOwojZGVmaW5lIEsgNQogaW50IGxbS107CiBpbnQgaT0wLGNbS109ezB9LGNmW0tdPXtOLUsrMSxOLUsrMixOLUsrMyxOLUsrNCxOLUsrNX07CiBmb3IoaT0xO2k8SztpKyspY1tpXT0tMTsKIGk9Y1swXT0wOwoKIHdoaWxlKDEpewogIC8vIGp1bXAgb3V0IG9mIHRoZSBsb29wPwogIGlmKCEoY1tpXTxjZltpXSkpewogICBpZihpPT0wKXsKICAgIGJyZWFrOwogICB9CiAgIGNbaV09LTE7CiAgIGktPTE7CiAgIGNbaV0rPTE7CiAgIGNvbnRpbnVlOwogIH0KICAvLyBpbml0IGxvb3A/CiAgaWYoY1tpXT09LTEpewogICBjW2ldPWNbaS0xXSsxOwogIH0KICBsW2ldPXByW2NbaV1dOwogIC8vIHN0YXJ0IG5ldyBsb29wCiAgaWYoaT09MCB8fCB0ZXN0KGwsaSxwcltjW2ldXSkpewogICBpKz0xOwogICBpZihpPT1LKXsKICAgIC8vIG1vc3QgaW5uZXIgbG9vcCBib2R5CiAgICBwcmludGYoIiVkICVkICVkICVkICVkICglZClcbiIsbFswXSxsWzFdLGxbMl0sbFszXSxsWzRdLGxbMF0rbFsxXStsWzJdK2xbM10rbFs0XSk7CiAgICBicmVhazsKICAgfQogIH1lbHNlewogICBjW2ldKz0xOwogIH0KIH0KCiBmcmVlKHByKTsKIHJldHVybiAwOwp9Cg==