依据递推公式计算,须要打表不然可能会超时。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vector> #include<stack> #include<queue> #include<map> #include<set> #include<list> #include<cmath> #include<string> #include<sstream> #include<ctime> using namespace std; #define _PI acos(-1.0) #define INF (1 << 10) #define esp 1e-6 typedef long long LL; typedef unsigned long long ULL; typedef pair<int,int> pill; /*=========================================== ===========================================*/ #define MAXD 50 int m; LL f[MAXD]; LL g[MAXD]; LL _g(int _n){ LL ans = (1 << _n) - f[_n]; return ans; } LL solve(int _n){ if(_n < 3) f[_n] = 0; else{ LL ans = (1 << (_n - 3)); for(int i = 2 ; i <= _n - 2 ; i++){ ans += g[i - 2] * (1 << (_n - i - 2)); } f[_n] = ans; } g[_n] = _g(_n); return f[_n]; } int main(){ memset(f,-1,sizeof(f)); LL ans ; for(int i = 0 ; i <= 30 ; i++) ans = solve(i); while(scanf("%d",&m) && m){ printf("%lld ",f[m]); } return 0; }