[关闭]
@ysner 2018-10-07T09:28:12.000000Z 字数 847 阅读 1543

luogu3941入阵曲

搜索


题面

统计在给出的矩阵中,有多少个不同的子矩形中的数字之和是的倍数?

解析

切不掉这道题是我傻逼
显然预处理出每列的前缀和。
然后枚举矩形的上界和下界,统计下范围内哪些列余数相等就行。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<algorithm>
  7. #define ll long long
  8. #define re register
  9. #define il inline
  10. #define fp(i,a,b) for(re int i=a;i<=b;i++)
  11. #define fq(i,a,b) for(re int i=a;i>=b;i--)
  12. using namespace std;
  13. const int N=500,M=1e6+100;
  14. int n,m,k,mx=1e6,tag=1,s[N][N],t[M];
  15. ll ans;
  16. il ll gi()
  17. {
  18. re ll x=0,t=1;
  19. re char ch=getchar();
  20. while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
  21. if(ch=='-') t=-1,ch=getchar();
  22. while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
  23. return x*t;
  24. }
  25. int main()
  26. {
  27. n=gi();m=gi();k=gi();
  28. fp(i,1,n)
  29. fp(j,1,m)
  30. s[i][j]=(gi()+s[i-1][j]+s[i][j-1]-s[i-1][j-1]+k)%k;
  31. fp(i,1,n)
  32. fp(j,i,n)
  33. {
  34. fp(l,0,m) ++t[(s[j][l]-s[i-1][l]+k)%k];
  35. fp(l,0,m) --t[(s[j][l]-s[i-1][l]+k)%k],ans+=t[(s[j][l]-s[i-1][l]+k)%k];
  36. }
  37. printf("%lld\n",ans);
  38. return 0;
  39. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注