当前位置:   article > 正文

上海计算机学会2023年8月月赛C++丙组T4素数行列_素数行列上海算法月赛

素数行列上海算法月赛

素数行列

内存限制: 256 Mb时间限制: 1000 ms

题目描述

给定一个 n×n 的矩阵,其中第 i 行、第 j 列的元素的值为 ai,j​。小爱每次可以花费一点代价,将某个元素的值 +1 。

请问,小爱最少花费多少点代价,才能使得某一行或某一列均为素数?

输入格式

输入第一行,一个正整数 n
接下来 n 行,每行 n 个正整数,其中第 i+1 行,第 j 个元素表示 ai,j​

输出格式

输出共一个整数,表示最小代价

数据范围
  • 对于 30% 的数据, 1≤n≤10
  • 对于 60% 的数据, 1≤n≤10^2,1≤ai,j​≤10^2
  • 对于 100% 的数据, 1≤n≤10^3,1≤ai,j​≤10^5
样例数据

输入:
3
5 4 3
1 7 8
9 2 6
输出:
1
说明:
花费一点代价把4改成5,第二列均为素数
 

解析:先用埃氏筛法求出一百万以内的素数,然后逐行逐列,求出大于等于aij最小的素数,求和的最小值,即为答案,详见代码。

 

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n;
  4. bool s[1000005];
  5. int ss[100005];
  6. int a[1005][1005];
  7. int len=0;
  8. int ans=1e9;
  9. int main() {
  10. for (int i=2;i<=1000;i++){//埃氏筛求出1000000以内的所有素数
  11. if (s[i]==0){
  12. for (int j=i*i;j<=1000000;j+=i){
  13. s[j]=1;
  14. }
  15. }
  16. }
  17. for (int i=2;i<=1000000;i++){//把这些素数转移到ss数组中,便于后边二分查找
  18. if (s[i]==0){
  19. len++;
  20. ss[len]=i;
  21. }
  22. }
  23. cin>>n;
  24. for(int i=1;i<=n;i++){//输入
  25. for (int j=1;j<=n;j++){
  26. cin>>a[i][j];
  27. }
  28. }
  29. for(int i=1;i<=n;i++){//对于每一行每一列计算需要增加的数
  30. int hsum=0;//第i行需要增加的数
  31. int lsum=0;//第i列需要增加的数
  32. for (int j=1;j<=n;j++){
  33. //找到大于等于第i行第j列的数的最小素数,算出需要最小增加的数
  34. hsum+=ss[lower_bound(ss,ss+len,a[i][j])-ss]-a[i][j];
  35. //找到大于等于第j行第i列的数的最小素数,算出需要最小增加的数
  36. lsum+=ss[lower_bound(ss,ss+len,a[j][i])-ss]-a[j][i];
  37. }
  38. //所有行列的最小值就是答案
  39. ans=min(ans,hsum);
  40. ans=min(ans,lsum);
  41. }
  42. cout<<ans;
  43. return 0;
  44. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/439948?site
推荐阅读
相关标签
  

闽ICP备14008679号