# include # include # include # include # include # include # include # include # include #include #include #include #include using namespace std; mt19937 randGenerator(28564789);//27081999 int n,m,b; int a[1005][1005]; int tek[1005]; bool isit[1005]; bool otg[1005]; long long maxsum=0; clock_t start; int news[1005]; bool newsit[1005]; void proveri() { int sum = 0; int i,j; for(i=1;i<=m;i++) { sum = sum + (news[i]%b)*(news[i]%b); } if(sum<=maxsum)return ; for(i=1;i<=m;i++) { tek[i]=news[i]; isit[i]=newsit[i]; } maxsum = sum; return ; } void tryit() { double time; time = 4.8; if(n>500)time = 3.90; int i,j; long long p=0; while((clock() - start ) / (double) CLOCKS_PER_SEC<=time) { p = (randGenerator())%n; p = p+ 1; if(newsit[p]==1) { for(i=1;i<=m;i++) news[i]-=a[p][i]; } else for(i=1;i<=m;i++) news[i]+=a[p][i]; newsit[p] = 1 - newsit[p]; proveri(); } return ; } void backtrack(int v) { // cout<n) { for(i=1;i<=m;i++) sum+=(tek[i]%b)*(tek[i]%b); // cout<maxsum){maxsum=sum;return ;} //for(i=1;i<=m;i++) // tek[i]-=a[v][i]; return ; } void add1(int v) { long long sum=0,i; for(i=1;i<=m;i++) { tek[i]+=a[v][i]; sum = sum + (tek[i]%b)*(tek[i]%b); } if(sum>maxsum){maxsum=sum; isit[v]=1;return ;} for(i=1;i<=m;i++) tek[i]-=a[v][i]; return ; } void del(int v) { long long sum=0,i; for(i=1;i<=m;i++) { tek[i]-=a[v][i]; // sum = sum + (tek[i]%b)*(tek[i]%b); }isit[v]=0; // if(sum>maxsum){maxsum=sum;return ;} // for(i=1;i<=m;i++) // tek[i]+=a[v][i]; return ; } void del1(int v) { long long sum=0,i; for(i=1;i<=m;i++) { tek[i]-=a[v][i]; sum = sum + (tek[i]%b)*(tek[i]%b); } if(sum>maxsum){maxsum=sum;isit[v]=0;return ;} for(i=1;i<=m;i++) tek[i]+=a[v][i]; return ; } bool check() { int i; long long sum=0; for(i=1;i<=m;i++) sum+=(tek[i]%b)*(tek[i]%b); if(sum>maxsum){maxsum=sum;return 1;} else return 0; } int main() { // cout<>n>>m>>b; int i,j; double time; time = 0.50; if(n>500)time = 3.0; for(i=1;i<=n;i++) for(j=1;j<=m;j++) { cin>>a[i][j]; a[i][j]=a[i][j]%b; } if(n<=20&&m<=20){solve1();return 0;} double duration; start = clock(); if(n==1000){ bool fl=1; //while((clock() - start ) / (double) CLOCKS_PER_SEC<=time) for(i=1;i<=n;i++) { if(!fl)break; for(j=i+1;j<=n;j++){ if((clock() - start ) / (double) CLOCKS_PER_SEC>=time){fl=0;break;} if(isit[i]==0) { add(i); } else del(i); if(isit[j]==0) { add(j); } else del(j); if(!check()) { if(isit[i]==0) { add(i); } else del(i); if(isit[j]==0) { add(j); } else del(j); } } }} else { while((clock() - start ) / (double) CLOCKS_PER_SEC<=time) for(i=1;i<=n;i++) { for(j=i+1;j<=n;j++) { if(isit[i]==0) { add(i); } else del(i); if(isit[j]==0) { add(j); } else del(j); if(!check()) { if(isit[i]==0) { add(i); } else del(i); if(isit[j]==0) { add(j); } else del(j); } } } } tryit(); int br=0; long long sum1=0; for(i=1;i<=n;i++) { br+=isit[i]; // sum1+=otg[i]* } cout<