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 }