提交时间:2025-10-21 12:58:38
运行 ID: 38715
#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back using namespace std; typedef long long ll; const int mod=1e9+7; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int pw[2005]; int cal(int _x,int _y){ return (pw[_x-1]*1ll*pw[_y-1]+(pw[_x-1]-1)*1ll*(pw[_y-1]-1))%mod; } void slv(){ pw[0]=1;up(i,1,2000)pw[i]=pw[i-1]*2%mod; int n=read(),m=read(),x=read(),y=read(),res=1; up(i,1,n) up(j,1,m){ int _x=min(x,n-i+1),_y=min(y,m-j+1); (res+=cal(_x,_y)*1ll*pw[(_x-1)*(_y-1)]%mod)%=mod; } up(i,1,n)up(j,1,m)up(k,i+x,n)up(l,j+y,m){ int s=cal(x,y)*1ll*cal(x,y)%mod; int sum=2*x*y-(x+y-1)*2-max(0,i+x-(k-x+1))*max(0,j+y-(l-y+1)); (res+=s*2ll*pw[sum]%mod)%=mod; if(k-x+1<=i+x-1&&l-y+1<=j+y-1){ int L1=pw[i+x-1-(k-x+1)+1]-1,L2=pw[j+y-1-(l-y+1)+1]-1; L1=L1*1ll*L1%mod,L2=L2*1ll*L2%mod;L1=L1*1ll*L2%mod; int s=(k-i-1)*(j+y-1-(l-y+1)+1)+(l-j-1)*(i+x-1-(k-x+1)+1)-(j+y-1-(l-y+1)+1)*(i+x-1-(k-x+1)+1); L1=L1*1ll*pw[s]%mod; (res+=mod-L1)%=mod; } } auto sol=[&](int n,int m,int x,int y){ up(i,1,n)up(j,1,m)up(k,j+y,m){ int _x=min(n-i+1,x); int s=max(0,j+y-1-(k-y+1)+1); auto cal=[&](int _x,int s){ return (pw[_x]-1)*1ll*(pw[_x]-1)%mod*1ll*pw[(2*(y-1)-s)*_x]%mod; }; (res+=cal(_x,s))%=mod; (res+=mod-cal(_x-1,s))%=mod; } }; sol(n,m,x,y); sol(m,n,y,x); cout<<res; } int main(){ //freopen("seed.in","r",stdin),freopen("seed.out","w",stdout); slv(); return 0; }