Codeforces Round #166 (Div. 2)

B. Prime Matrix

题意很简单,就是求从给定矩阵基础上构造一个素数矩阵需要最少进行多少次加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 }
原文地址:https://www.cnblogs.com/jzwong/p/4419840.html