游客 Signup | Login
中文 | En

1935 - 拼车方案

现有n个人需要乘坐出租车,共有m辆车。1至4个人可以拼一辆车。问有多少种拼车方案。

Input

多组数据。一行一组,包括两个整数n,m。数据保证n,m均不超过300。

Output

每组数据输出一行,为答案(即方案数,请输出它模100007后的结果)。

Examples

Input

3 2
2 3

Output

6
0

Hint

样例说明

3个人拼2辆车,共有六种方案:

方案一

甲车:1

乙车:23


方案二

甲车:2

乙车:13

<br />

<p>
	方案三
</p>
<p>
	甲车:3
</p>
<p>
	乙车:12
</p>
<p>
	<br />
</p>

方案四至六略,只需将甲乙颠倒即可。

<br />

本题有多种解法,数据范围不大,都能AC,欢迎踊跃尝试。

Solution C++

#include <iostream>
#include <cstring>
using namespace std;
typedef long long ll;
const ll moder = 100007;
ll f[305][305][5];
int main(){
    int n, m;
    while(cin >> n >> m){
      memset(f, 0, sizeof(f));
      f[1][1][1] = f[2][1][2] = f[3][1][3] = f[4][1][4] = 1;
      for(ll i = 2; i <= n; ++i)
        for(int j = 1; j <= m; ++j){
          for(int p = 1; p <= 4; ++p){
            if(i-p <= 0)
              continue;
            ll &s = f[i][j][p], *t = f[i-p][j-1], k = 1;
            if(p == 1) k = i;
            if(p == 2) k = i*(i-1)/2;
            if(p == 3) k = i*(i-1)*(i-2)/6;
            if(p == 4){
              //cout << "&&" << i << endl;
              k = i*(i-1)*(i-2)*(i-3)/24;
            }
            //if(k<0) cout << "!!!" << endl;
            s += (k*t[1])%moder;
            if(i-p > 1)
              s += (k*t[2])%moder;
            if(i-p > 2)
              s += (k*t[3])%moder;
            if(i-p > 3)
              s += (k*t[4])%moder;
            s = s%moder;
          }
        }
      ll ans = f[n][m][1]+f[n][m][2]+f[n][m][3]+f[n][m][4];
      ans = ans%moder;
      cout << ans << endl;
    }
    return 0;
}

Hint

样例说明

3个人拼2辆车,共有六种方案:

方案一

甲车:1

乙车:23


方案二

甲车:2

乙车:13

<br />

<p>
	方案三
</p>
<p>
	甲车:3
</p>
<p>
	乙车:12
</p>
<p>
	<br />
</p>

方案四至六略,只需将甲乙颠倒即可。

<br />

本题有多种解法,数据范围不大,都能AC,欢迎踊跃尝试。

Time Limit 1 second
Memory Limit 128 MB
Discuss Stats
上一题 下一题