正题
大意
在一个n*m的矩阵里找三个矩阵,要求他们三都不在同一行和同一列。然后要求价值不在minT和maxT之间,他们的价值就等于dis[A,B]+dis[B,C]+dis[A,C]dis[A,B]+dis[B,C]+dis[A,C]。求方案数。
解题思路
首先如果需要去掉重复的所以我们可以把A锁定在B和C上面
,而C锁定在A和B下面,然后有6种情况。
然后求出一种之后要乘上6。
求出在maxT之间的值减去minT的值就好了
我们枚举宽度差,之后求出满足价值的最大高度差,然后分为:
1. 宽度差过了边界
2. 宽度差没过边界
然后推公式
代码
#include<cstdio>
#define mods 1000000007
using namespace std;
int n,m;
long long sum1[4002],sum2[4002],mint,maxt;
long long work(long long x)
if (x<8) return 0;
long long ans,tmp;
ans=0;
for (int i=2;i<n;i++)
{
int j=(x-2*i)/2;
if (j<=1) break;
if (j+1>=m) tmp=6*(n-i)*(i-1)*sum2[m-2]%mods;
else tmp=6*(n-i)*(i-1)*(sum1[j-1]*(m-j)+sum2[j-2])%mods;
ans=(ans+tmp)%mods;
}
return ans;
}
int main()
{
scanf("%d%d%d%d",&n,&m,&mint,&maxt);
for (int i=1;i<=4001;i++)
{
sum1[i]=sum1[i-1]+i;
sum2[i]=sum2[i-1]+sum1[i];
}
printf("%lld",(work(maxt)+mods-work(mint-1))%mods);
}