本题先考虑两边都平行于xy轴的,只需要找1*2矩形数量 *4
本人以n作为行数,m作为列数
再考虑只有一条边平行x轴的:
1、考虑底为2,高为1
那你想象一下x轴为底,可以有(m-2)条吧
而对于每一个x轴的底来说,可以在上面找顶点,也可以在下面找顶点
然后最上方和最下方都只能分别在下面和上面找点
你把最上方和最下方的找到的点想象为1条,那不就是2*(n-1)嘛
(也可以想象为2*(n-2+0.5+0.5))
故为2 * (n-1)的方法数
然后你的不做底的那个顶点可以随便移动吧,有m-1-1的方法数,后一个-1是因为之前有一个2条边都平行的重复了
故为2 * (m-2) * (n-1) * (m-2)
同理后面的都是这样
2、考虑底为1,高为2
2* (m-1) * (n-2) * (m-2)
继续考虑一条边平行y轴的:
1、考虑底为2,高为1(这里的底依然是x轴的)
2* (m-2) * (n-1) * (n-2)
2、考虑底为1,高为2
2* (m-1) * (n-2) * (n-2)
(为什么就歪了呢。。。
其中还要考虑1e9 * 1e9 * 1e9炸的事情
#include<bits/stdc++.h>
#define lson (o<<1)
#define rson (o<<1|1)
#define fi first
#define sc second
#define dbg(x) cout<<#x<<" = "<<(x)<<endl;
#define rg register
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
using namespace std;
const double pi=acos(-1);
const double eps=1e-6;
inline int lowbit(int x){return x&(-x);}
template<typename A,typename B,typename C> inline A fpow(A x,B p,C yql){
A ans=1;
for(;p;p>>=1,x=1LL*x*x%yql)if(p&1)ans=1LL*x*ans%yql;
return ans;
}
inline int read()
{
int X=0,w=1;
char c=getchar();
while(c<'0'||c>'9')
{
if (c=='-')
{
w=-1;
}
c=getchar();
}
while(c>='0'&&c<='9')
{
X=(X<<3)+(X<<1)+(c^48);
c=getchar();
}
return X*w;
}
//inline void w(int x) { if(x>9) w(x/10); putchar(x%10+'0'); }
int mod=1e9+7;
int main(){
std::ios::sync_with_stdio(0);
ll n,m,ans=0;
cin>>n>>m;
ans=(n-1)*(m-2)*4+(n-2)*(m-1)*4;//2条边都和x,y平行的,就算几个1*2的方格数*4就好了
ans%=mod;
ans=(ans+2*(n-1)*(m-2)%mod*(m-2)); //算只有一条边平行x的所有 底为2,高为1的三角(排除掉两边都平行xy的)
ans=(ans+2*(n-2)*(m-1)%mod*(m-2));//算只有一条边平行x的所有 底为1,高为2的三角(排除掉两边都平行xy的)
ans=(ans+2*(n-1)*(m-2)%mod*(n-2));//算只有一条边平行y的所有 底为2,高为1的三角(排除掉两边都平行xy的)
ans=(ans+2*(n-2)*(m-1)%mod*(n-2));//算只有一条边平行y的所有 底为1,高为2的三角(排除掉两边都平行xy的)
cout<<ans%mod;
return 0;
}