牛客编程巅峰赛S2第6场 - 钻石&王者 B Bang! Bang!(思维 + 组合数)

思路:m个重音符之间至少间隔k个音符,所以 (m - 1) * k个音符是必选的多余音符,然后再从n - (m - 1) * k个音符中选出m个音符即可,答案就是C_{n - (m - 1) * k}^{m},提前判断一下n够不够选。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
const int N = 1100;
const int M = 1e6 + 10;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;

ll com[N][N];
class Solution {
public:
    void init() {
        memset(com, 0, sizeof(com));
        for(int i = 0; i < N; ++i) {
            com[i][0] = com[i][i] = 1;
            for(int j = 1; j < i; ++j)
                com[i][j] = (com[i - 1][j] + com[i - 1][j - 1]) % mod;
        }
    }

    long long solve_bangbang(int n, int m, int k) {
        init();
        ll tmp = (m - 1) * k + m;
        if(tmp > n) return 0;
        n -= (m - 1) * k;
        return com[n][m]; 
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_43871207/article/details/110739160