1. 程式人生 > >pow並不能算很大

pow並不能算很大

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;
		//有一點簡單特判,正常情況是一個完美二叉樹的節點個數減去最小二叉平衡樹的節點個數 
	}
}