| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
字典树+详细的分类讨论+一堆剪枝=200行,写的我要吐了。。贴AC代码Source Code
Problem: 1165 User: yzhw
Memory: 804K Time: 47MS
Language: G++ Result: Accepted
Source Code
# include <iostream>
# include <cstring>
using namespace std;
class node
{
public:
node *next[10];
node()
{
for(int i=0;i<10;i++)
next[i]=NULL;
}
};
int total,first;
node *root;
void add(node *p,int num,int pos)
{
if(p->next[(num/pos)%10]==NULL)
p->next[(num/pos)%10]=new node();
if(pos==1) return;
else add(p->next[(num/pos)%10],num,pos/10);
}
void maketree()
{
bool tmp[100000];
root=new node();
memset(tmp,1,sizeof(tmp));
for(int i=2;i<=99999;i++)
{
if(tmp[i])
{
if(i>=10000&&i%10+(i/10)%10+(i/100)%10+(i/1000)%10+(i/10000)%10==total)
{
add(root,i,10000);
}
for(int j=2*i;j<=99999;j+=i)
tmp[j]=0;
}
}
}
int array[6][6];
void dfs(int pos)
{
if(pos==1)
{
for(int ii=first;ii<=first;ii++)
if(root->next[ii])
{
array[1][1]=ii;
node *p=root->next[ii];
for(int i=0;i<=9;i++)
if(p->next[i]&&root->next[i])
{
node *p1=p->next[i];
array[1][2]=i;
for(int j=0;j<=9;j++)
if(p1->next[j]&&root->next[j])
{
node *p2=p1->next[j];
array[1][3]=j;
for(int k=0;k<=9;k++)
if(p2->next[k]&&root->next[k])
{
array[1][4]=k;
node *p3=p2->next[k];
for(int l=0;l<=9;l++)
if(p3->next[l]&&root->next[l])
{
array[1][5]=l;
dfs(pos+1);
}
}
}
}
}
}
else if(pos==2)
{
node *p=root;
for(int j=1;j<pos;j++)
p=p->next[array[j][1]];
for(int i=0;i<10;i++)
if(p->next[i]&&root->next[i])
{
array[2][1]=i;
node *p1=root->next[array[1][1]],*p2=root->next[array[2][1]],*p3=root->next[array[1][2]];
for(int t1=0;t1<10;t1++)
if(p1->next[t1]&&p2->next[t1]&&p3->next[t1])
{
array[2][2]=t1;
node *p4=root->next[array[1][3]],*p5=p2->next[array[2][2]];
for(int t2=0;t2<10;t2++)
if(p4->next[t2]&&p5->next[t2])
{
array[2][3]=t2;
node *p6=p5->next[t2],*p7=root->next[array[1][4]];
for(int t3=0;t3<10;t3++)
if(p6->next[t3]&&p7->next[t3])
{
array[2][4]=t3;
node *p8=p6->next[t3],*p9=root->next[array[1][5]];
for(int t4=0;t4<10;t4++)
if(p8->next[t4]&&p9->next[t4])
{
array[2][5]=t4;
dfs(pos+1);
}
}
}
}
}
}
else if(pos==3)
{
node *p=root;
for(int j=1;j<pos;j++)
p=p->next[array[j][1]];
for(int i=0;i<10;i++)
if(p->next[i]&&root->next[i])
{
array[3][1]=i;
node *p1=root->next[array[3][1]],*p2=root->next[array[1][2]]->next[array[2][2]];
for(int t1=0;t1<10;t1++)
if(p1->next[t1]&&p2->next[t1])
{
array[3][2]=t1;
node *p3=root->next[array[1][1]]->next[array[2][2]],*p4=root->next[array[1][3]]->next[array[2][3]],*p5=p1->next[array[3][2]];
for(int t2=0;t2<10;t2++)
if(p4->next[t2]&&p5->next[t2]&&p3->next[t2])
{
array[3][3]=t2;
node *p6=p5->next[t2],*p7=root->next[array[1][4]]->next[array[2][4]];
for(int t3=0;t3<10;t3++)
if(p6->next[t3]&&p7->next[t3])
{
array[3][4]=t3;
node *p8=p6->next[t3],*p9=root->next[array[1][5]]->next[array[2][5]];
for(int t4=0;t4<10;t4++)
if(p8->next[t4]&&p9->next[t4])
{
array[3][5]=t4;
dfs(pos+1);
}
}
}
}
}
}
else if(pos==4)
{
node *p=root;
for(int j=1;j<pos;j++)
p=p->next[array[j][1]];
for(int i=0;i<10;i++)
if(p->next[i]&&root->next[i])
{
array[4][1]=i;
node *p1=root->next[array[4][1]],*p2=root->next[array[1][2]]->next[array[2][2]]->next[array[3][2]];
for(int t1=0;t1<10;t1++)
if(p1->next[t1]&&p2->next[t1])
{
array[4][2]=t1;
node *p4=root->next[array[1][3]]->next[array[2][3]]->next[array[3][3]],*p5=p1->next[t1];
for(int t2=0;t2<10;t2++)
if(p4->next[t2]&&p5->next[t2])
{
array[4][3]=t2;
node *p6=p5->next[t2],*p7=root->next[array[1][4]]->next[array[2][4]]->next[array[3][4]],*p3=root->next[array[1][1]]->next[array[2][2]]->next[array[3][3]];
for(int t3=0;t3<10;t3++)
if(p6->next[t3]&&p7->next[t3]&&p3->next[t3])
{
array[4][4]=t3;
node *p8=p6->next[t3],*p9=root->next[array[1][5]]->next[array[2][5]]->next[array[3][5]];
for(int t4=0;t4<10;t4++)
if(p8->next[t4]&&p9->next[t4])
{
array[4][5]=t4;
dfs(pos+1);
}
}
}
}
}
}
else if(pos==5)
{
node *p=root;
for(int j=1;j<pos;j++)
p=p->next[array[j][1]];
for(int i=0;i<10;i++)
if(p->next[i]&&root->next[i])
{
array[5][1]=i;
node *p1=root->next[array[5][1]],*p2=root->next[array[1][2]]->next[array[2][2]]->next[array[3][2]]->next[array[4][2]];
for(int t1=0;t1<10;t1++)
if(p1->next[t1]&&p2->next[t1])
{
array[5][2]=t1;
node *p4=root->next[array[1][3]]->next[array[2][3]]->next[array[3][3]]->next[array[4][3]],*p5=p1->next[t1];
for(int t2=0;t2<10;t2++)
if(p4->next[t2]&&p5->next[t2])
{
array[5][3]=t2;
node *p6=p5->next[t2],*p7=root->next[array[1][4]]->next[array[2][4]]->next[array[3][4]]->next[array[4][4]];
for(int t3=0;t3<10;t3++)
if(p6->next[t3]&&p7->next[t3])
{
array[5][4]=t3;
node *p8=p6->next[t3],*p9=root->next[array[1][5]]->next[array[2][5]]->next[array[3][5]]->next[array[4][5]],*p3=root->next[array[1][1]]->next[array[2][2]]->next[array[3][3]]->next[array[4][4]];
for(int t4=0;t4<10;t4++)
if(p8->next[t4]&&p9->next[t4]&&p3->next[t4])
{
array[5][5]=t4;
if(root->next[array[5][1]]&&root->next[array[5][1]]->next[array[4][2]]&&root->next[array[5][1]]->next[array[4][2]]->next[array[3][3]]&&root->next[array[5][1]]->next[array[4][2]]->next[array[3][3]]->next[array[2][4]]&&root->next[array[5][1]]->next[array[4][2]]->next[array[3][3]]->next[array[2][4]]->next[array[1][5]])
{
for(int o1=1;o1<=5;o1++)
{
for(int o2=1;o2<=5;o2++)
cout<<array[o1][o2];
cout<<endl;
}
cout<<endl;
}
}
}
}
}
}
}
}
int main()
{
cin>>total>>first;
maketree();
dfs(1);
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator