[洛谷P3941] 入陣曲

題目背景

丹青千秋釀,一醉解愁腸。 
無悔少年枉,只願壯志狂。

入陣曲
題解在代碼裏。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;
}

博主蒟蒻,能夠隨意轉載,但必須附上原文連接k-z-j

相關文章
相關標籤/搜索