Prime Matrix

  【B.Prime Matrix】

  http://www.codeforces.com/contest/271/problem/B

  题目大意:n×m的格子,每次操作可以将一个格子中的数字加1,问最少操作次数使得存在一行或一列全为质数。

  预处理出每个格子需要多少次操作成为质数,然后求最小行、列和即可。素数筛表即可,注意多筛一些。

  一开始没打素数表,直接+1 +1的判断,导致超时...然后就有了上一篇文章...

 
  
 1 #include <iostream>

 2 #include <cmath>

 3 #define min(a,b) (((a)<(b))? (a):(b))

 4 

 5 const  int MAXN=101000;

 6 bool flag[MAXN];

 7 int prime[MAXN/3],pi,num[501][501];

 8 using namespace std;

 9 bool isPrime(int x)

10 {//不打素数表的时候用来判断一个数是否为素数

11     if(x==1)

12         return false;

13     if (x==2)

14         return true;

15     for (int i=2;i<=(int)sqrt((long double)x);i++)

16     {

17         if (x%i==0)

18             return false;

19     }

20     return true;

21 }

22 void GetPrime_Improved()

23 {    //打素数表.任何一个数与其它所有素数的乘积必然也不是素数(这是因为每个合数必有一个最小素因子)。

24     //初始置为false,素数为false,非素数为true

25     int i,j;

26     pi=0;

27     memset(flag,false,sizeof(flag));

28     flag[1]=true;

29     for (i=2;i<MAXN;i++)

30     {

31         if (!flag[i])

32             prime[pi++]=i;

33         for ( j = 0 ; ( j<pi )&&( i * prime[j]<MAXN ) ; j++)

34         {

35             flag[i*prime[j]]=true;

36             if ( i % prime[j] == 0) //保证每个非素数只被筛一次

37                 break;

38         }

39     }

40 }

41 int main()

42 {

43     int i,j,k,n,m,temp,rowCount,columnCount,countMin=0x7FFFFFFF;

44     cin>>n>>m;

45     GetPrime_Improved();    

46     for (i=0;i<n;i++)

47         for (j=0;j<m;j++)

48         {

49             cin>>temp;

50             k=0;

51             while (flag[temp+k])

52                 k++;

53             num[i][j]=k;    

54         }

55     for (i=0;i<n;i++)

56         {

57             rowCount=0;

58             for (j=0;j<m;j++)

59                 rowCount+=num[i][j];

60             countMin=min(rowCount,countMin);

61         }

62     for (j=0;j<m;j++)

63         {

64             columnCount=0;

65             for (i=0;i<n;i++)

66                 columnCount+=num[i][j];

67             countMin=min(columnCount,countMin);

68         }

69         cout<<countMin<<endl;

70     return 0;

71 }

 

你可能感兴趣的:(Matrix)