제출 #1132578

#제출 시각아이디문제언어결과실행 시간메모리
1132578t9unkubjBoat (APIO16_boat)C++20
100 / 100
585 ms6524 KiB
#ifdef t9unkubj #define _GLIBCXX_DEBUG #include"debug.cpp" //#include"template_no_debug.h" #else #define dbg(...) 199958 #endif #pragma GCC optimize("O3") using namespace std; #include<bits/stdc++.h> using ll=long long; using ull=unsigned long long; template<class T>using vc=vector<T>; template<class T>using vvc=vc<vc<T>>; #define rep(i,n) for(ll i=0;i<(ll)(n);i++) #define REP(i,j,n) for(ll i=(j);i<(ll)(n);i++) #define DREP(i,n,m) for(ll i=(n);i>=(m);i--) #define drep(i,n) for(ll i=((n)-1);i>=0;i--) #define all(x) x.begin(),x.end() #define rall(x) x.rbegin(),x.rend() template<class T,class F> bool chmin(T &x, F y){ if(x>y){ x=y; return true; } return false; } template<class T, class F> bool chmax(T &x, F y){ if(x<y){ x=y; return true; } return false; } double pass_time=0; template<class T,class G,class F> F modpow(T x,G p,F m){ T ret=1%m; x%=m; while(p){ if(p&1)ret=(1ll*ret*x)%m; x=(1ll*x*x)%m; p>>=1; } return ret; } template<class T> T extgcd(T a,T b,T&x,T&y){//ax+by=gcd(a,b)となるようなもの if(b==0){ x=1; y=0; return a; }else{ T res=extgcd(b,a%b,y,x); y-=(a/b)*x; return res; } } template<class T> pair<T,T> inv(T x,T m){ T a1,a2; T res=extgcd(x,m,a1,a2); return {a1,m/res}; } constexpr int mod=1e9+7; struct mint{ int val; inline long long fast(long long x){ if(x<mod&&x>=0)return x; x%=mod; if(x<0)x+=mod; return x; } mint():val(0){} mint(long long val):val(fast(val)){} mint power(long long m)const { mint res(1); mint ret(*this); while(m){ if(m&1)res*=ret; ret*=ret; m>>=1; } return res; } mint& operator++() { val++; if (val == mod) val = 0; return *this; } mint& operator--() { if (val == 0)val=mod; val--; return *this; } mint operator++(int) { mint result = *this; ++*this; return result; } mint operator--(int) { mint result = *this; --*this; return result; } mint operator-() const { return mint(-val); } friend mint operator +(const mint&a,const mint&b) noexcept{ return mint(a)+=b; } friend mint operator -(const mint&a,const mint&b) noexcept{ return mint(a)-=b; } friend mint operator *(const mint&a,const mint&b) noexcept{ return mint(a)*=b; } friend mint operator /(const mint&a,const mint&b) noexcept{ return mint(a)/=b; } mint& operator+=(const mint&a)noexcept{ val+=a.val; if(val>=mod)val-=mod; return *this; } mint& operator-=(const mint&a)noexcept{ val-=a.val; if(val<0)val+=mod; return *this; } mint& operator*=(const mint&a){ val=fast(1ll*val*a.val); return *this; } mint& operator/=(const mint&a){ val=fast(1ll*val*inv<long long>(a.val,mod).first); return *this; } bool operator == (const mint&x)const noexcept{ return this->val==x.val; } bool operator != (const mint&x)const noexcept{ return this->val!=x.val; } friend ostream& operator << (ostream &os, const mint &x) noexcept { return os << x.val; } friend istream& operator >> (istream &is, mint &x) noexcept { long long v; is >> v; x=mint(v); return is; } }; vector<mint>fact(1,1),invfact(1,1); void build(int n){ if(n<(int)fact.size())return; fact=invfact=vector<mint>(n+1); fact[0]=1; for(int i=1;i<=n;i++)fact[i]=fact[i-1]*i; invfact[n]=(1/fact[n]); for(int i=n-1;i>=0;i--)invfact[i]=invfact[i+1]*(i+1); } mint C(int a,int b){//aCb if(a<0||b<0||a-b<0)return mint(0); while((int)fact.size()<=a){ fact.push_back(fact.back()*(fact.size())); } while((int)invfact.size()<=a){ invfact.push_back(invfact.back()/invfact.size()); } return fact[a]*invfact[b]*invfact[a-b]; } mint P(int a,int b){ if(a<b||b<0)return 0; return fact[a]*invfact[a-b]; } //a個のものからb個を重複を許して選ぶ mint H(int a,int b){ return C(a+b-1,b); } void print(mint a) { cout << a; } template<class T> pair<T,T> mod_solve(T a,T b,T m){//ax=b mod mとなるxを返す a%=m,b%=m;if(a<0)a+=m;if(b<0)b+=m; T g=gcd(gcd(a,b),m); a/=g,b/=g,m/=g; if(gcd(a,m)>1)return {-1,-1}; return {(inv(a,m).first*b)%m,inv(a,m).second}; } /* dp[i][j][l]:=i番目までみて現在j区画目をl人が見ている */ vvc<pair<int,int>> brute(int n,vc<int>a,vc<int>b){ vvc<pair<int,int>>ans; REP(i,1,1<<n){ vc<int>is; vc<pair<int,int>>f{{-1,-1}}; rep(j,n)if(i>>j&1)is.push_back(j); auto dfs=[&](auto&dfs,int I,vc<pair<int,int>>pres)->void{ if(I==is.size()){ ans.push_back(pres); return; } int i=is[I]; REP(j,a[i],b[i]+1){ if(j>pres.back().first){ pres.push_back({j,i}); dfs(dfs,I+1,pres); pres.pop_back(); } } }; dfs(dfs,0,f); } return ans; } int solve(int n,vc<int>a,vc<int>b){ map<int,int>ma; rep(i,n)ma[a[i]]=0; rep(i,n)ma[b[i]+1]=0; int id=0; ma[-1]=0; for(auto&[x,y]:ma)y=id++; int c=ma.size()-1; vc<int>len(c); for(auto&[x,y]:ma){ if(y<c)len[y]-=x; if(y)len[y-1]+=x; } len[0]=0; vvc<mint>comb(c,vc<mint>(n+1)); rep(i,c){ comb[i][0]=1; rep(j,n){ //C(len[i],j) to C(len[i],j+1) comb[i][j+1]=comb[i][j]*(len[i]-j)/mint(j+1); } } vvc<mint>dp(c+1,vc<mint>(n+1)); dp[0][0]=1; rep(i,n){ vvc<mint>ndp=dp; int L=ma[a[i]],R=ma[b[i]+1]; //[L,R) //segment vc<mint>pre(i+1); REP(j,1,R){ rep(l,i+1){ pre[l]+=dp[j-1][l]*comb[j-1][l]; if(j>=L)ndp[j][1]+=pre[l]; if(j>=L)ndp[j][l+1]+=dp[j][l]; } } dp=move(ndp); } mint ans=-1; rep(i,c)rep(j,n+1){ ans+=dp[i][j]*comb[i][j]; } return ans.val; } void run(){ int n; cin>>n; vc<int>a(n),b(n); rep(i,n)cin>>a[i]>>b[i]; cout<<solve(n,a,b)<<"\n"; } signed main(){ #ifdef t9unkubj freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); #endif cin.tie(0)->sync_with_stdio(0); pass_time=clock(); int t=1; //cin>>t; run(); pass_time=clock()-pass_time; dbg(pass_time/CLOCKS_PER_SEC); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...