这个题 是让联系的三个U。 那么可以让前n 个没有连续的。 后面的随意。
刘汝佳 P331 很详细了。
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <string>
#include <map>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <cctype>
using namespace std;
#define ll long long
typedef unsigned long long ull;
#define maxn 1000+10
#define INF 1<<30
ll pow_(ll a, ll b){
ll sum = 1;
for(ll i = 1; i <= b; i++)
sum *= a;
return sum;
}
int main (){
ll g[maxn] = {0},f[maxn] = {0};
f[0] = f[1] = f[2] = 0;
g[0] = 1, g[1] = 2, g[2] = 4;
for(ll i = 3; i <= 30; i++){
for(ll j = 2; j <= i-2; j++){
f[i] += (ll)g[j - 2]*(ll)pow_(2, i - j - 2);
}
f[i] += (ll)pow_(2, i-3);
g[i] = (ll)pow_(2,i) - f[i];
}
ll n;
while(scanf("%lld",&n) && n){
printf("%lld\n",f[n]);
}
return 0;
}