https://codeforces.com/problemset/problem/730/J

Nick has n bottles of soda left after his birthday. Each bottle is described by two values: remaining amount of soda ai and bottle volume bi (ai ≤ bi).

Nick has decided to pour all remaining soda into minimal number of bottles, moreover he has to do it as soon as possible. Nick spends x seconds to pour x units of soda from one bottle to another.

Nick asks you to help him to determine k — the minimal number of bottles to store all remaining soda and t — the minimal time to pour soda into k bottles. A bottle can't store more soda than its volume. All remaining soda should be saved.

Input

The first line contains positive integer n (1 ≤ n ≤ 100) — the number of bottles.

The second line contains n positive integers a1, a2, ..., an (1 ≤ ai ≤ 100), where aiis the amount of soda remaining in the i-th bottle.

The third line contains n positive integers b1, b2, ..., bn (1 ≤ bi ≤ 100), where bi is the volume of the i-th bottle.

It is guaranteed that ai ≤ bi for any i.

Output

The only line should contain two integers k and t, where k is the minimal number of bottles that can store all the soda and t is the minimal time to pour the soda into k bottles.

Examples

Input

4
3 3 4 3
4 7 6 5

Output

2 6

Input

2
1 1
100 100

Output

1 1

Input

5
10 30 5 6 24
10 41 7 8 24

Output

3 11

Note

In the first example Nick can pour soda from the first bottle to the second bottle. It will take 3 seconds. After it the second bottle will contain 3 + 3 = 6 units of soda. Then he can pour soda from the fourth bottle to the second bottle and to the third bottle: one unit to the second and two units to the third. It will take 1 + 2 = 3 seconds. So, all the soda will be in two bottles and he will spend 3 + 3 = 6 seconds to do it.

C++版本一

/*
*@Author:   STZG
*@Language: C++
*/
#include <bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<bitset>
#include<queue>
#include<deque>
#include<stack>
#include<cmath>
#include<list>
#include<map>
#include<set>
//#define DEBUG

using namespace std;
typedef long long ll;
const int N=100+10;
const double PI = acos(-1.0);
const double EXP = 1E-8;
const int INF = 0x3f3f3f3f;
int t,n,m;
struct node {
    int a,b;
    bool operator < (const node & S)const{
        if(b!=S.b)
            return b>S.b;
        else
            return a>S.a;
    }
}e[N];
int dp[N][N*N];
int main()
{
#ifdef DEBUG
	freopen("input.in", "r", stdin);
	//freopen("output.out", "w", stdout);
#endif
    scanf("%d",&n);
    int sum=0;
    memset(dp,-1,sizeof(dp));
    for(int i=1;i<=n;i++){
        scanf("%d",&e[i].a);
        sum+=e[i].a;
    }
    for(int i=1;i<=n;i++)
        scanf("%d",&e[i].b);
    sort(e+1,e+n+1);
    int tmp=0;
    int cnt=0,ans=0;
    for(int i=1;i<=n;i++){
        tmp+=e[i].b;
        if(tmp>=sum){
            cnt=i;
            break;
        }

    }
    dp[0][0]=0;
    for(int i=1;i<=n;i++){
        for(int j=sum;j>=e[i].a;j--){
            for(int k=i;k>=1;k--){
                if(dp[k-1][j-e[i].a]!=-1)
                    dp[k][j]=max(dp[k][j],dp[k-1][j-e[i].a]+e[i].b);
            }
        }
    }

    for(int i=sum;i>=1;i--){
        if(dp[cnt][i]>=sum){
            ans=sum-i;
            break;
        }
    }
    cout << cnt <<" "<< ans << endl;
    //cout << "Hello world!" << endl;
    return 0;
}

C++版本二