丹青千秋釀,一醉解愁腸。 無悔少年枉,只願壯志狂。
入陣曲
題解在代碼裏。ios
#include<iostream> #include<cstdio> #include<cstring> using namespace std; long long a[1000][1000],sum[1000][1000],ans=0,tot,n,m,k,flag[1100000],b[1110000]; int main() { cin>>n>>m>>k; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { scanf("%lld",&a[i][j]); sum[i][j]=sum[i][j-1]+a[i][j]+sum[i-1][j]-sum[i-1][j-1];//sum數組存矩陣的和; } for(int i=0;i<n;i++)//枚舉行 for(int j=i+1;j<=n;j++)//枚舉行 { //memset(flag,0,sizeof(flag));//不能用memset,速度太慢,會超時13個點 flag[0]=1;//由於mod k等於0說明它本身就能組成一個矩陣mod k等於0;因此一開始賦值爲1 for(int t=1;t<=m;t++)//枚舉列 { b[t]=(sum[i][t]-sum[j][t])%k; if(b[t]<0) b[t]+=k;//可能小於0,因此要加k變爲正數 ans+=flag[b[t]];//關鍵地方,前面算出有多少mod k餘吧b[t],當前 b[t]-以前mod k餘b[t]的能夠獲得一個mod k餘0的矩陣; flag[b[t]]++;//由於此時多了一個上面得出來的; } for(int t=1;t<=m;t++) flag[b[t]]=0;//清空flag數組 } printf("%lld",ans); return 0; }