honoka最近在研究三角形计数问题。
她认为,满足以下三个条件的三角形是“好三角形”。
1.三角形的三个顶点均为格点,即横坐标和纵坐标均为整数。
2.三角形的面积为1。
3.三角形至少有一条边和x轴或y轴平行。
honoka想知道,在平面中选取一个大小为 的矩形格点阵,可以找到多少个不同的“好三角形”?由于答案可能过大,请对1E9取模。
就两种,底1高2,底2高1,注意不能重复
算完之后,简单取个模就行了
楼下早已洞穿,就是写的时候为了看的舒服因式分解了一下
a和b只是用来简化表示大数取模运算的,实际上这题求解时,由于有一边与x或y平行,所以只有1为底,2为高,1为高2为底这两种情况,,,然后你画一个简单的图,把他们表示出来,注意不要重复运算,然后为了取模,将它变为(ab)%c=((a%c)(b%c))%c的格式,也就是因式分解,就完成了,详细一点为,比方说有一个mn的格点,x为m,y方向n个,我们以2为底,平行于x轴,那么在m个格点里我们共有m-2个2,(比如三个格点只有一个2),那么它所有的上面一行的m个点,都可以构成好三角形,有m个,最上面一行无法向上构成,因而又(n-1)行,又,可以从上往下画三角形,同理,也是n-1行,每行有m-2个2,每个2对应m个点。然后这种三角形我们平行y轴,将刚刚式子,m和n对调即可。对于底为1,高为2的情况,同理每行有m-1个1,每个1对应m-2个点(这里减去两个是为了把和平行y轴,底为2的重复的去掉),显然有n-2行,上下再2,m、n再对调,加起来即为总和,因式分解到能够取模的地步,完成。

我当时就是算完化简,为了取模看的舒服一点这么写的
@……@
卖个萌,溜了

#include<stdio.h>
#define mod 1000000007
int main()
{
  long long int sum,m,n;
  scanf("%lld%lld",&m,&n);
  long long int a,b;
  a=2*(m+n-2);
  b=(2*m*n-3*m-3*n+4);
  sum=((a%mod)*(b%mod))%mod;//底为1高为2,底为2高为1
  printf("%lld\n",sum );
  return 0;
}