#include<bits/stdc++.h>
using namespace std;
const int N =1e3+5; 
int dp[12][N][N];// i j k选了i个数组成1-j,最大数为k 
int mx[12];//当前i位数凑出来的最大数 
void solve(){
	int n;
    cin>>n;
    if(n==1){
        cout<<"1 1"<<endl;
        return;
    }
    int k=n,cnt=0;
    while(k){
        k/=2;
        cnt++;
    }
    dp[1][1][1]=1;
    mx[1]=1;
    for(int i=1;i<=cnt-1;i++){//选了i个数
    	for(int j=1;j<=mx[i];j++){//当前i个数能凑出最大数
    		for(int k=i;k<=j;k++){//这i个数最大位k
    			for(int e=k+1;e<=j+1;e++){//转移,就加一个e最大数变成e
    				dp[i+1][min(j+e,n)][e]+=dp[i][j][k];//加一个e 
    				mx[i+1]=max(mx[i+1],j+e);
    			}
    		}
    	}
    }

    int ans=0;
    for(int i=1;i<=n;i++){
    	ans+=dp[cnt][n][i];
    }
    cout<<cnt<<" "<<ans<<endl;
}
int main()
{
    ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
    int T;
	T=1;
    while(T--)solve();
    return 0;
}


0 comments

No comments so far...