2 条题解

  • 4
    @ 2025-5-7 12:00:49

    我终于不再是没有马丽的人了

    在此给出一个跑的飞快的总耗时为90ms的做法 首先不难注意到一个性质: 末尾一行和末尾一列这两个数一定是每一位为非 55 奇数的数。原因请读者自己思考。

    然后不难发现像这样的质数只有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
    上传者