比赛 至少完成十道练习 评测结果 AAAAAAAAAA
题目名称 素数方阵 最终得分 100
用户昵称 Mealy 运行时间 3.941 s
代码语言 C++ 内存使用 4.61 MiB
提交时间 2017-05-22 19:19:41
显示代码纯文本
//890
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
const int nmax=100010;
int N,M;
//Trie
int ch[nmax][10]={0};
int val[nmax]={0};
int tot;

int num[6]={0};
void Init(){
	memset(ch,0,sizeof(ch));
	memset(val,0,sizeof(val));
	tot=0;
}
void Idx(int x){
	int i=4;
	memset(num,0,sizeof(num));
	while(x){
		num[i]=x%10;
		x/=10;
		i--;
	}
}
void Insert(int x){
	Idx(x);
	int t=0;
	int c=0;
	for(int i=0;i<5;i++){
		c=num[i];
		if(!ch[t][c]){
			tot++;
			ch[t][c]=tot;
			val[tot]=c;
		}
		t=ch[t][c];
	}
}
//END
bool P[nmax]={0};
bool Judge(int x){
	int sum=0;
	while(x){
		sum+=x%10;
		x/=10;
	}
	if(sum==N){
		return 1;
	}
	return 0;
}
void EulerGetPrime(){
	int r=100000;
	int l=10000;
	for(int i=2;i<=sqrt(r);i++){
		if(P[i]){
			continue;
		}
		for(int j=i*i;j<=r;j+=i){
			P[j]=1;
		}
	}
	for(int i=l;i<=r;i++){
		if(Judge(i)&&!P[i]){
//			printf("%d\n",i);
			Insert(i);
		}
	}
}
int res[6][6]={0};
int r[6][6]={0};
int c[6][6]={0};
int m[6]={0};
int s[6]={0};

inline bool Check(int i,int j,int x){
	
	if(!ch[r[i-1][j]][x]){
		return 0;
	}
	else{
		r[i][j]=ch[r[i-1][j]][x];
	}
	if(!ch[c[i][j-1]][x]){
		return 0;
	}
	else{
		c[i][j]=ch[c[i][j-1]][x];
	}
	if(i==j){
		if(!ch[m[i-1]][x]){
			return 0;
		}
		else{
			m[i]=ch[m[i-1]][x];
		}
	}
	if(i+j==6){
		if(!ch[s[j-1]][x]&&(j!=1)){
			return 0;
		}
		else{
			s[j]=ch[s[j-1]][x];
		}
	}
	return 1;
}
vector<string> ans;
void DFS(int x,int y){
	int newx,newy;
	newx=x;newy=y;
	newx++;
	if(newx==6){
		newx=1;
		newy++;
	}
	if(y==6){
		string tmp;
		for(int i=1;i<=5;i++){
			for(int j=1;j<=5;j++){
				tmp+=res[i][j]+'0';
			}
		tmp+="\n";
		}
		ans.push_back(tmp);
		return ;
	}
	for(int i=0;i<=9;i++){
		res[x][y]=i;
		if(Check(x,y,i)){
			DFS(newx,newy);
		}
	}
	return ;
}

void Col(){
	scanf("%d%d",&N,&M);
	Init();
	EulerGetPrime();
	
	res[1][1]=M;
	r[1][1]=ch[0][M];
	c[1][1]=ch[0][M];
	m[1]=ch[0][M];
	DFS(2,1);
	sort(ans.begin(),ans.end());
	for(int i=0;i<ans.size();i++){
		cout<<ans[i]<<endl;
	}
}

int main(){
	freopen("prime3.in","r",stdin);
	freopen("prime3.out","w",stdout);
	Col();
	return 0;
}