Submission #667418

#TimeUsernameProblemLanguageResultExecution timeMemory
667418MohammadAghilBoat (APIO16_boat)C++17
100 / 100
645 ms4412 KiB
      #include <bits/stdc++.h>
//   #pragma GCC optimize ("Ofast,unroll-loops")
// #pragma GCC target ("avx2")
 using namespace std;
  typedef long long ll;
   typedef pair<ll, ll> pp;
     #define per(i,r,l) for(int i = (r); i >= (l); i--)
       #define rep(i,l,r) for(int i = (l); i < (r); i++)
          #define all(x) begin(x), end(x)
             #define sz(x) (int)(x).size()
                 #define pb push_back
                     #define ss second
                          #define ff first
                                  void err(istringstream *iss){}template<typename T,typename ...Args> void err(istringstream *iss,const T &_val, const Args&...args){string _name;*iss>>_name;if(_name.back()==',')_name.pop_back();cerr<<_name<<" = "<<_val<<", ",err(iss,args...);}
void IOS(){
     cin.tie(0) -> sync_with_stdio(0);
     // #ifndef ONLINE_JUDGE
     //      #define er(args ...) cerr << __LINE__ << ": ", err(new istringstream(string(#args)), args), cerr << endl
     //      freopen("inp.txt", "r", stdin);
     //      freopen("out.txt", "w", stdout);
     // #else
     //      #define er(args ...) 0
     // #endif
}
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const ll mod = 1e9 + 7, maxn = 5e2 + 5, lg = 17, inf = ll(1e18) + 5, p = 9973;
ll pw(ll a,ll b,ll md=mod){if(!b)return 1;ll k=pw(a,b>>1ll,md);return k*k%md*(b&1ll?a:1)%md;}
 
ll dp[maxn][maxn<<1], a[maxn], b[maxn];
ll inv[maxn];

int main(){ IOS();
     inv[0] = 1;
     rep(i,1,maxn) inv[i] = pw(i, mod-2);
     
     int n; cin >> n;
     vector<int> p{0};
     rep(i,1,n+1){
          cin >> a[i] >> b[i];
          b[i]++;
          p.pb(a[i]), p.pb(b[i]);
     }
     sort(all(p)), p.erase(unique(all(p)), end(p));
     int m = sz(p);
     rep(i,0,m) dp[0][i] = 1;
     rep(i,1,n+1){
          int t = upper_bound(all(p), a[i]) - begin(p);
          rep(j,t,m){
               dp[i][j] = dp[i][j-1];
               if(p[j] > b[i]) continue;
               ll cr = p[j] - p[j-1];
               int s = 1;
               per(k,i-1,0){
                    dp[i][j] += cr*dp[k][j-1]%mod;
                    dp[i][j] %= mod;

                    if(a[k] <= p[j-1] && b[k] >= p[j]){
                         cr = cr*(s + p[j] - p[j-1])%mod;
                         s++;
                         cr = cr*inv[s]%mod;
                    }
               }
               // er(i, j, p[j], dp[i][j]);
          }
     } 
     ll ans = 0;
     rep(i,1,n+1) ans += dp[i][m-1], ans %= mod;
     cout << ans << '\n';
     return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...