fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long ll;
  5. typedef pair<int, int> ii;
  6.  
  7. const int INF = 1e9;
  8. const ll LINF = 1e18;
  9.  
  10. const int N = 5e2 + 5;
  11. const int MX = 1e7 + 5;
  12.  
  13. int n, m;
  14. int a[N][N];
  15.  
  16. bool prime[MX];
  17.  
  18. void sieve() {
  19. for (int i = 2; i < MX; i++) prime[i] = true;
  20.  
  21. for (int i = 2; i * i < MX; i++) {
  22. if (prime[i]) {
  23. for (int j = i * i; j < MX; j += i) prime[j] = false;
  24. }
  25. }
  26. }
  27.  
  28. // Gọi d(x) = khoảng cách của x đến số nguyên tố gần nhất mà >= x
  29. // Ta có nhận xét: d(x) <= ~230 với x <= 1e9, nên với 1 số x ta có thể trâu để tính d(x)
  30. int d[N][N];
  31. int sum_r[N]; // sum_r[i] = tổng d(x) của các số x có trong hàng i
  32. int sum_c[N]; // sum_c[j] = tổng d(x) của các số x có trong cột j
  33.  
  34. void precompute() {
  35. sieve();
  36.  
  37. for (int i = 1; i <= n; i++) {
  38. for (int j = 1; j <= m; j++) {
  39. while (!prime[a[i][j]]) {
  40. ++a[i][j];
  41. ++d[i][j];
  42. }
  43. sum_r[i] += d[i][j];
  44. sum_c[j] += d[i][j];
  45. }
  46. }
  47. }
  48.  
  49. int main() {
  50. ios::sync_with_stdio(0); cin.tie(0);
  51. cin >> n >> m;
  52. for (int i = 1; i <= n; i++) {
  53. for (int j = 1; j <= m; j++) cin >> a[i][j];
  54. }
  55.  
  56. precompute();
  57.  
  58. int ans = INF;
  59. for (int i = 1; i <= n; i++) ans = min(ans, sum_r[i]);
  60. for (int j = 1; j <= m; j++) ans = min(ans, sum_c[j]);
  61.  
  62. cout << ans << '\n';
  63. }
Success #stdin #stdout 0.05s 13828KB
stdin
3 3
1 2 3
4 9 8
2 3 9
stdout
1