题意很简单,就是求从给定矩阵基础上构造一个素数矩阵需要最少进行多少次加1操作,所谓的素数矩阵是矩阵一行或者一列全为素数。这里可以换一个思路思考,我们可以找出矩阵某行(或某列)元素距其最近的素数的差值,然后对这些差进行排序,最小的数即为所求。当然我们需要预先求一个素数数组存储起来,这也是需要学会的。
1 #include<iostream> 2 #include<algorithm> 3 #define N 1000011 4 using namespace std; 5 bool p[N]; 6 int s[N]; 7 int x[501][501]; 8 int r[501], c[501]; 9 void init()//建立一个素数表 10 { 11 memset(p, 1, sizeof(p)); 12 for (int i = 2; i*i < N; i++) 13 { 14 for (int j = i; i*j < N; j++) 15 p[i*j] = 0; 16 } 17 s[0] = 0; 18 for (int i = 2; i<N; i++) 19 if (p[i]) 20 s[++s[0]] = i; 21 } 22 int solve(int x)//求已知数到最近素数的距离 23 { 24 int pos = lower_bound(s + 1, s + 1 + s[0], x) - s; 25 return s[pos] - x; 26 } 27 int main() 28 { 29 int n, m,i,j,ans; 30 init(); 31 while (cin >> n >> m) 32 { 33 memset(r, 0, sizeof(r)); 34 memset(c, 0, sizeof(c)); 35 for (i = 1; i <= n; i++){ 36 for (j = 1; j <= m; j++) 37 { 38 cin >> x[i][j]; 39 r[i] += solve(x[i][j]); 40 c[j] += solve(x[i][j]); 41 } 42 } 43 sort(r + 1, r + 1 + n); 44 sort(c + 1, c + 1 + m); 45 ans = min(r[1], c[1]); 46 cout << ans << endl; 47 return 0; 48 } 49 }
时间: 2024-11-09 00:18:00