http://hihocoder.com/problemset/problem/1476
显然就是容斥原理了。
先算出所有的矩阵一共有多少个
ll sum=n*(n+1)/2*m*(m+1)/2;
然后考虑对于任取x个黑色方框,
他们组成一个新的矩形,然后计算有多少个矩阵会覆盖整个矩形,也即,两条边所夹住的对顶两个小正方形的所有点的乘积
奇减偶加即可
#include <bits/stdc++.h> using namespace std; typedef long long ll; const ll mod=1e9+7; const int N=1e5+10; ll r[15],c[22]; int main() { ll n,m; cin>>n>>m; int k; cin>>k; for(int i=0; i<k; i++) scanf("%d%d",&r[i],&c[i]); ll sum=n*(n+1)/2*m*(m+1)/2; ll all=1<<k; ll maxx,minx,maxy,miny; for(int i=1; i<all; i++) { maxx=maxy=-1e9; minx=miny=1e9; for(int j=0; j<k; j++) { if (i&(1LL<<j)) { maxx=max(maxx,r[j]); minx=min(minx,r[j]); maxy=max(maxy,c[j]); miny=min(miny,c[j]); } } ll mx=n-(maxx)+1; ll my=m-(maxy)+1; ll tmp=minx*miny*mx*my; int num=__builtin_popcount(i); if (num%2) sum-=tmp; else sum+=tmp; } printf("%lld\n",sum); return 0; }