【2018.4.14】模拟赛之三-ssl2393 单元格

本文介绍了一种在给定矩阵中寻找符合特定条件的三个矩阵的方案数量的方法。通过锁定矩阵的位置并考虑六种不同的排列组合,利用枚举技术和公式推导来解决这一问题。

正题


大意

在一个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种情况。


ANN
NBN
NNC
NAN
BNN
NNC
NNA
BNN
NCN
ANN
NNB
NCN
NAN
NNB
CNN
NNA
NBN
CNN

然后求出一种之后要乘上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);
}

转载于:https://www.cnblogs.com/sslwyc/p/8847843.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值