76pts
查看原帖
76pts
565450
__K2FeO4楼主2022/12/25 18:17

第 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;
}
2022/12/25 18:17
加载中...