#ifndef INCLUDED_MAIN #define INCLUDED_MAIN #include __FILE__ int main() { vector> ta(4); ll lim; rep(i,4) cin>>ta[i].second; rep(i,4) cin>>ta[i].first; cin>>lim; sort(all(ta)); ll ans=0; rep(i,4) { auto cur=ta[i]; ll can=min(cur.second,lim/cur.first); ans+=can; lim-=can*cur.first; } cout< using namespace std; #define rep(i,n) for(ll i=0;i vector pfact(ll n) { vector resp; vector prefact(sqrtl(n)+10); for(ll i=2;i*i<=n;i++) { while(n%i==0) { n/=i; if(!prefact[i]) resp.push_back(i); prefact[i]=true; } } if(n!=1) resp.push_back(n); return resp; } ll vecmax(vector &a) { ll ans=-1*INF; rep(i,(ll)a.size()) { ans=max(ans,a[i]); } return ans; } ll vecmin(vector &a) { ll ans=INF; rep(i,(ll)a.size()) { ans=min(ans,a[i]); } return ans; } ll safemod(ll num,ll rule) { return (num%rule+rule)%rule; } ll modinv(ll a, ll mod) { //拡張Euclidによるmodでの逆元, a*u+mod*v=1を解く ll b=mod,u=1,v=0; while (b) { ll t=a/b; a-=t*b; swap(a,b); u-=t*v; swap(u,v); } u%=mod; if (u < 0) u+=mod; return u; } vector Erasieve(ll n) { vector is_prime(n+1, true); is_prime[0] = is_prime[1] = false; for (int i=2;i*i<=n;++i) { if (is_prime[i]) { for (int j=i*i;j<=n;j+=i) is_prime[j] = false; } } vector primes; srep(i,2,n) { if (is_prime[i]) primes.push_back(i); } return primes; } ll divcount(ll n) { ll ans=0; for(int i=1;i*i<=n;i++) { if(n%i==0) ans+=(i*i==n ? 1:2); } return ans; } struct UnionFind { //Potentializedでない vector par; vector rank;//これは各木のsizeに近いものを表す UnionFind(int N) : par(N), rank(N,0) { rep(i,N) { par[i] = i; } } // 経路圧縮 int root(int x) { if (par[x]==x) return x; return par[x]=root(par[x]); } void unite(int x,int y) { int rx=root(x); int ry=root(y); if (rx==ry) return; if (rank[rx] par; vector wgt; // 各ノードの根からの XOR 差分 vector rank; // 木の高さ的な XORPotentialUF(int size) : par(size),wgt(size,0),rank(size,0) { rep(i,size) par[i]=i; } pair find(int u) { if (par[u]!=u) { int orig_par=par[u]; auto [root,diff]=find(orig_par); par[u]=root; wgt[u]^=diff; return {root,wgt[u]}; } return {u,0}; } bool limitunite(int u,int v,int z) { auto [pu,ru]=find(u); auto [pv,rv]=find(v); if (pu==pv) { return (ru^rv)==z; } if (rank[pu] struct ADDPotentialUF { //0-indexed!! reference: https://qiita.com/drken/items/cce6fc5c579051e64fab super感謝 vector par; vector rank; vector wgt; ADDPotentialUF(int size) : par(size),wgt(size,0),rank(size,0) { rep(i,size) par[i]=i; } pair find(int x) { if (par[x]==x) { return {x,0}; } else { auto [r,w]=find(par[x]); par[x]=r; wgt[x]+=w; return {r,wgt[x]}; } } ABEL weight(int x) { find(x); return wgt[x]; } bool issame(int x,int y) { return find(x).first==find(y).first; } bool unite(int x,int y,ABEL w) { w+=weight(x); w-=weight(y); x=find(x).first; y=find(y).first; if (x==y) { return (diff_ytox(x,y)==w); } if (rank[x] void vecpr(T first,T last) { ll tmp=0; for(auto it=first;it!=last;++it) { if(tmp) cout<<" "; cout<<*it; tmp++; } cout< void vvpr(vector> a) { for(int i=0;i<(ll)a.size();i++) { for(int j=0;j<(ll)a[i].size();j++) { if(j) cout<<" "; cout< slmax(vector a, ll limit, ll breadth) {//slidewindowによる幅breadthでの区間最大値評価,limit=a.size() deque deq; vector max_numbers(limit, (-1)*INF); rep(i, limit) { while (!deq.empty() && deq.front() <= i - breadth) deq.pop_front(); while (!deq.empty() && a[deq.back()] <= a[i]) deq.pop_back(); deq.push_back(i); max_numbers[i] = a[deq.front()]; } return max_numbers; } vector slmin(vector a, ll limit, ll breadth) {//slidewindowによる幅breadthでの区間最小値評価,limit=a.size() deque deq; vector min_numbers(limit, INF); rep(i, limit) { while (!deq.empty() && deq.front() <= i - breadth) deq.pop_front(); while (!deq.empty() && a[deq.back()] >= a[i]) deq.pop_back(); deq.push_back(i); min_numbers[i] = a[deq.front()]; } return min_numbers; } ll modpow(ll fl, ll po, ll mode) { // mode: 0=modなし, 1=modあり ll ret=1; if (mode) { while (po>0) { if (po&1) ret=(ret*fl)%mod; fl=(fl*fl)%mod; po>>=1; } } else { while (po>0) { if(po&1) ret*=fl; fl*=fl; po>>=1; } } return ret; } ll gcd(ll a,ll b) { //Euclid if(a lis_min(vector &a) { ll n=(ll)a.size(); vector dp(n,INF); rep(i,n){ auto itr = lower_bound(dp.begin(),dp.end(), a[i]); *itr = a[i]; } return dp; }//あんま使えない vector lis_size(vector& a) { // 最長増加部分列の a index目までみたのがdp[a]; ll n=a.size(); vector dp(n,1); vector seq; rep(i,n) { auto it=lower_bound(seq.begin(), seq.end(), a[i]); if (it==seq.end()) seq.push_back(a[i]); else *it=a[i]; dp[i]=distance(seq.begin(), lower_bound(seq.begin(), seq.end(), a[i]))+1; } srep(i,1,n-1) { if(dp[i]