第 5 个点理应通过,为何蛙了?
剩下的求思路。
#include <bits/stdc++.h>
#define f(i,j,k) for(int i=j;i<=k;i++)
#define mpvc(x,y) make_pair(x,y)
#define p1 first
#define p2 second
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pvc;//poly vinyl chlorine
map<pvc,bool> mp;
const ll mod=1e9+7;
ll x[20418],y[20418];
int main()
{
ll n,m,t,d,k;
scanf("%lld",&t);
while(t--) {
mp.clear();
scanf("%lld%lld%lld%lld",&n,&m,&k,&d);
if(k==2) {
ll ls=0;
f(i,1,d){
scanf("%lld%lld",x+i,y+i);
mp[mpvc(x[i],y[i])]=1;
ls+=4;
if(x[i]==1||x[i]==n)ls--;
if(y[i]==1||y[i]==m)ls--;
}
f(i,1,d){
if(mp[mpvc(x[i],y[i]-1)]==1)ls--;
if(mp[mpvc(x[i]-1,y[i])]==1)ls--;
}
ll p=n*m-d;
ll ans=((p%mod*((p-1)%mod)%mod
*(mod+1)/2%mod+ls-2*n*m%mod+n+m)%mod+mod)%mod;
printf("%lld\n",ans);
}
else{
bool ch=0;
if(n>m)swap(n,m),ch=1;
if(m<3||(n==1&&m<5)){
puts("0");
continue;
}
ll p=n*m%mod;
ll inv=166666668;
ll ans=n!=1?(((p*(p+mod-1)%mod*(p+mod-2)%mod
*inv%mod-(p-2)*(2*p-n-m)%mod+4*(n-1)*(m-1)%mod
+2*(p-n-m))%mod+mod)%mod):((m+mod-2)*
(m+mod-3)%mod*(m+mod-4)%mod*inv%mod);
printf("%lld\n",ans);
}
}
return 0;
}