网站建设设计计划表,电子商务专业怎么样,淘宝网站的建设目标,wordpress html5视频插件正题 大意
在一个n*m的矩阵里找三个矩阵#xff0c;要求他们三都不在同一行和同一列。然后要求价值不在minT和maxT之间#xff0c;他们的价值就等于dis[A,B]dis[B,C]dis[A,C]dis[A,B]dis[B,C]dis[A,C]。求方案数。 解题思路
首先如果需要去掉重复的所以我们可以把A锁定在B和…正题 大意
在一个n*m的矩阵里找三个矩阵要求他们三都不在同一行和同一列。然后要求价值不在minT和maxT之间他们的价值就等于dis[A,B]dis[B,C]dis[A,C]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种情况。 ANNNBNNNC
NANBNNNNC
NNABNNNCN
ANNNNBNCN
NANNNBCNN
NNANBNCNN 然后求出一种之后要乘上6。 求出在maxT之间的值减去minT的值就好了 我们枚举宽度差之后求出满足价值的最大高度差然后分为 1. 宽度差过了边界 2. 宽度差没过边界
然后推公式 代码
#includecstdio
#define mods 1000000007
using namespace std;
int n,m;
long long sum1[4002],sum2[4002],mint,maxt;
long long work(long long x)//求值{if (x8) return 0;long long ans,tmp;ans0;for (int i2;in;i){int j(x-2*i)/2;if (j1) break;if (j1m) tmp6*(n-i)*(i-1)*sum2[m-2]%mods;else tmp6*(n-i)*(i-1)*(sum1[j-1]*(m-j)sum2[j-2])%mods;ans(anstmp)%mods;}return ans;
}
int main()
{scanf(%d%d%d%d,n,m,mint,maxt);for (int i1;i4001;i){sum1[i]sum1[i-1]i;sum2[i]sum2[i-1]sum1[i];//预处理}printf(%lld,(work(maxt)mods-work(mint-1))%mods);
}