honoka和格点三角形

本题先考虑两边都平行于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;
}





发布了66 篇原创文章 · 获赞 11 · 访问量 5410

猜你喜欢

转载自blog.csdn.net/weixin_43982216/article/details/104174338