2 条题解
-
4
我终于不再是没有马丽的人了
在此给出一个跑的飞快的总耗时为90ms的做法
首先不难注意到一个性质:
末尾一行和末尾一列这两个数一定是每一位为非 奇数的数。原因请读者自己思考。然后不难发现像这样的质数只有249个!
那很好了,完全可以先把这些质数打成表,优先去填这些数。填好后,我们来看下图
其中,红色的部分是我们已经填好的,不难注意到上面四条绿线都是头尾填好的,那么我们自然可以预处理出以任意数字开头任意数字结尾的质数,将它们放到一个三维数组中。所以第二步是填对角线和四周。
填好后,整个方阵就只剩下了四个位置
那好办啊,它们都可以通过用k减另外四个数得到,填上之后再check就好了总结一下,我们填的顺序就是这样:

于是你就可以得到一个跑的飞快的check矩阵以便调试代码的代码:
#include<iostream> #include<cmath> using namespace std; const int N=1e7+10; int prime[N],vis[N]; int tot; void EulerPrime(){ for(int i=2;i<=N;i++){ if(!vis[i])prime[++tot]=i; for(int j=1;j<=tot&&i*prime[j]<=N;j++){ vis[i*prime[j]]=1; if(i%prime[j]==0)break; } } } int a[10][10]; signed main(){ EulerPrime(); while(1){ for(int i=1;i<=5;i++){ for(int j=1;j<=5;j++){ char c; cin>>c; a[i][j]=c-'0'; } } cout<<"5 行:"<<endl; for(int i=1;i<=5;i++){ int sum=0; for(int j=1;j<=5;j++)sum+=a[i][j]; cout<<sum<<endl; } cout<<endl; cout<<"5 列:"<<endl; for(int i=1;i<=5;i++){ int sum=0; for(int j=1;j<=5;j++)sum+=a[j][i]; cout<<sum<<endl; } cout<<endl; cout<<"对角线:"<<endl; int sum=0; for(int i=1;i<=5;i++)sum+=a[i][i]; cout<<sum<<endl; sum=0; for(int i=1;i<=5;i++)sum+=a[6-i][i]; cout<<sum<<endl; cout<<endl; for(int i=1;i<=5;i++){ sum=0; for(int j=1;j<=5;j++){ sum+=a[i][j]*pow(10,5-j); } if(!vis[sum])cout<<sum<<" is prime"<<endl; else cout<<sum<<" is not prime"<<endl; } cout<<endl; for(int i=1;i<=5;i++){ sum=0; for(int j=1;j<=5;j++){ sum+=a[j][i]*pow(10,5-j); } if(!vis[sum])cout<<sum<<" is prime"<<endl; else cout<<sum<<" is not prime"<<endl; } cout<<endl; sum=0; for(int i=1;i<=5;i++)sum+=a[i][i]*pow(10,5-i); if(!vis[sum])cout<<sum<<" is prime"<<endl; else cout<<sum<<" is not prime"<<endl; cout<<endl; sum=0; for(int i=1;i<=5;i++)sum+=a[6-i][i]*pow(10,5-i); if(!vis[sum])cout<<sum<<" is prime"<<endl; else cout<<sum<<" is not prime"<<endl; cout<<endl; } return 0; }真正的代码:

信息
- ID
- 202
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- (无)
- 递交数
- 79
- 已通过
- 7
- 上传者