zoukankan      html  css  js  c++  java
  • 【题解】洛谷P1350 车的放置(矩阵公式推导)

    洛谷P1350:https://www.luogu.org/problemnew/show/P1350

    思路

    把矩阵分为上下两块N与M

    放在N中的有i辆车 则放在M中有k-i辆车

    N的长为a   宽为b

    M的长为a+c   宽为d

    在每个矩阵中的放置种类公式如下:

    A(长度,车辆)*C(宽度,车辆)

    给出证明:

    比如对于N来说

    可以在a列中找出i列放入车 所以是A(a,i)

    而且有C(b,i)种选择列的方式

    由此可得 枚举放在N和M的车有几辆 并计算两个矩阵种类之积即可

    PS:对于矩阵M来说A为A(a+c-i,k-i) 而不是A(a+c,k-i)    因为每排只能放1辆而且有i辆已经放在N中了

    代码

    #include<iostream>
    using namespace std;
    #define mod 100003
    #define ll long long
    #define maxn 2005
    ll a,b,c,d,k,ans;
    ll fc[maxn][maxn];
    ll A(ll n,ll m)
    {
        ll sum=1;
        for(ll i=1;i<=m;i++)
        sum=sum%mod*(n-m+i)%mod;//排列递推 
        return sum;
    }
    ll C(int n,int m)
    {
        if(fc[n][m]) return fc[n][m];//记忆化 
        if(m>n) return 0;//如果放不下了 
        if(n==m||m==0) return fc[n][m]=1;
        fc[n][m]=(C(n-1,m-1)%mod+C(n-1,m)%mod)%mod;//组合递推 
        return fc[n][m];
    }
    int main()
    {
        cin>>a>>b>>c>>d>>k;
        for(ll i=0;i<=k;i++)//枚举i辆车放在N中 k-i辆车放在M中 
            ans=(ans+A(a,i)%mod*C(b,i)%mod*A(a+c-i,k-i)%mod*C(d,k-i)%mod)%mod;
        cout<<ans;
    } 
    View Code
  • 相关阅读:
    如何使用Log4j
    HDU 1114
    老鼠与毒药问题
    HDU 1065
    HDU 1301(MST)
    HDU 1078
    HDU 2159
    删除字符问题(贪心)
    正整数分解为几个连续自然数之和
    OpenJudge
  • 原文地址:https://www.cnblogs.com/BrokenString/p/9691157.html
Copyright © 2011-2022 走看看