pow()并不能算很大的值,自己推出dp结果没ac
牛客第二场
#include <cstdio>
#include <map>
#include <iostream>
#include<cstring>
#include<bits/stdc++.h>
#define M
#define ll long long int
using namespace std;
ll dp[70][70]; //值为最小节点数
ll zuoyi(ll x)
{ ll ans=0;
ll temp=1;
for(int i=1;i<=x-1;i++)
{ans+=temp;
temp*=2;}
return ans;
}
// 由于pow()函数在精度方面的问题,没能再比赛的时候ac,要自己写一个。
int main(){
ll n,t;
memset(dp,0,sizeof(dp));
for(int i=0;i<=60;i++){
dp[1][i]=1;
dp[0][i]=0;
}
for(int i=1;i<=60;i++)
for(int j=1;j<=60;j++){
if(i>j)
dp[i][j]=dp[i-1][j]+dp[i-j-1][j]+1;
else
dp[i][j]=i;
}
//预处理:dp[i][j],i是表示高度,j是表示平衡度.
while(cin>>n>>t){
ll ans1=0;
ll h=n-1-t;
if(t!=0){
if(h>0){
ans1=zuoyi(n);
cout<<ans1-dp[n-1-t][t]<<endl;
}
else
{
ans1=zuoyi(n);
cout<<ans1<<endl;
}
}
else
cout<<"0"<<endl;
//有一点简单特判,正常情况是一个完美二叉树的节点个数减去最小二叉平衡树的节点个数
}
}