#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define popcount __builtin_popcount using namespace std; typedef long long int ll; typedef pair P; const ll MOD=1e9+7; template struct ConvexHullTrickMonotone{ using P=pair; deque

deq; ConvexHullTrickMonotone(){} void add(T a, T b){ if(!ismin) a*=(-1), b*=(-1); if(deq.empty()){ deq.push_back({a, b}); return; } if(deq.back().first<=a){ if(deq.back().first==a && deq.back().second<=b) return; while(deq.size()>1){ T a1=deq.back().first, b1=deq.back().second; T a2=deq[deq.size()-2].first, b2=deq[deq.size()-2].second; if((b1-b2)*a2*(a-a1)<(b-b1)*a*(a1-a2)) break; deq.pop_back(); } deq.push_back({a, b}); }else{ while(deq.size()>1){ T a1=deq.front().first, b1=deq.front().second; T a2=deq[1].first, b2=deq[1].second; if((b1-b2)*a2*(a-a1)>(b-b1)*a*(a1-a2)) break; deq.pop_front(); } deq.push_front({a, b}); } } T get(T x, bool isinc){ if(isinc){ while(deq.size()>1){ T a1=deq.front().first, b1=deq.front().second; T a2=deq[1].first, b2=deq[1].second; if(x/a1+b11){ T a1=deq.back().first, b1=deq.back().second; T a2=deq[deq.size()-2].first, b2=deq[deq.size()-2].second; if(x/a1+b1>n; ll a[200020]; ll tot=1; for(int i=0; i>a[i]; tot=min(MOD, tot*a[i]); } if(tot==MOD){ ll ans=1; for(int i=0; i cht; ll dp[200020]; dp[0]=0; cht.add(1, 0); for(int i=0; i