Submission #406651

#TimeUsernameProblemLanguageResultExecution timeMemory
406651gevacrtBoat (APIO16_boat)C++17
100 / 100
1819 ms12232 KiB
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;

#define int ll

typedef vector<int> vi;
typedef pair<int, int> ii;
typedef vector<ii> vii;
typedef vector<vi> vvi;
typedef vector<vii> vvii;

#define INF INT_MAX
#define MOD 1000000007
#define all(x) x.begin(), x.end()

ull binexp(ull base, ull pow, ull M=MOD){
    ull res = 1;
    while(pow){
        if(pow & 1) res *= base;
        pow >>= 1, base *= base;
        if(M) base %= M, res %= M;
    }
    return res;
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    vi inv(510);
    for(int x = 0; x < 510; x++)
        inv[x] = binexp(x, MOD-2);

    int N; cin >> N;

    vii A(N+1); vi B;
    for(int x = 1; x <= N; x++){
        cin >> A[x].first >> A[x].second;
        A[x].second++;
        B.push_back(A[x].first); B.push_back(A[x].second);
    }

    sort(all(B));

    vector<vvi> dp(2, vvi(B.size(), vi(N+1)));
    int prev = 0, curr = 1;

    for(int c = 1; c < B.size(); c++)
        dp[prev][c][0] = 1;

    for(int x = 1; x <= N; x++){
        dp[curr][0][0] = 1;
        for(int c = 1; c < B.size(); c++){
            // j = 0 case
            dp[curr][c][0] = 0;
            for(auto val : dp[curr][c-1])
                dp[curr][c][0] += val, dp[curr][c][0] %= MOD;

            for(int j = 1; j <= min(x, B[c]-B[c-1]); j++){
                dp[curr][c][j] = dp[prev][c][j];
                if(A[x].first <= B[c-1] and B[c] <= A[x].second){
                    int val = (B[c]-B[c-1]-j+1)*inv[j]; val %= MOD;
                    dp[curr][c][j] += (dp[prev][c][j-1]*val)%MOD; dp[curr][c][j] %= MOD;
                }
            }
        }
        swap(prev, curr);
    }

    int ans = 0;
    for(auto val : dp[prev][B.size()-1])
        ans += val, ans %= MOD;

    cout << (ans-1+MOD)%MOD << endl;

    return 0;
}

Compilation message (stderr)

boat.cpp: In function 'int main()':
boat.cpp:52:22: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   52 |     for(int c = 1; c < B.size(); c++)
      |                    ~~^~~~~~~~~~
boat.cpp:57:26: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   57 |         for(int c = 1; c < B.size(); c++){
      |                        ~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...