- paste
MT3137-sum
- 2022-9-21 17:44:00 @
#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...