mayoko’s diary

プロコンとかいろいろ。

SRM 463 div1 easy: RabbitNumbering

解法

数字を小さい順に並べると, i+1 番目の数字は, i 番目の数字が取れる数字はもちろん取れるし, それより大きな数字も取りうる可能性があります。よって, 数字を小さい順に並べて i 番目の数が取りうる数字の場合の数 maxNumber[i]-i を掛け算していけば OK です。

ll MOD = 1e9+7;

class RabbitNumbering {
public:
    int theCount(vector <int> maxNumber) {
        int n = maxNumber.size();
        sort(maxNumber.begin(), maxNumber.end());
        ll ans = 1;
        for (int i = 0; i < n; i++) {
            if (maxNumber[i] <= i) return 0;
            (ans *= maxNumber[i]-i) %= MOD;
        }
        return (int)ans;
    }
};