题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2045

问题分析:

假设三种颜色编号为1 2  3,第一个格子涂1,那么此后第二个格子就只能涂2或3,然后再第三个格子中2对应的可以涂1,3;3对应得可以涂1,2。一直到最后一个格子。如果用一个树形表示就是

因为最后一个格子和第一个格子的颜色不能相同,所以总方案数就是最后得分支数减去分支中1的个数。

但是这些1和非1的个数是有规律可循的。非1的个数来自前一个格子非1的个数加上1的个数*2。1的个数是2^n - 非1的个数

所以非1的个数用数学公式表达就是:

因为是三种颜色所以最后总方案数是 Sn = an*3

code:

#include <cstdio>

using namespace std;
typedef long long LL;

LL a[50+7];
LL s[50+7];

void init()
{
    for(int i=0; i<57; i++)
        s[i] = a[i] = 0;
}
LL pow2(int n)
{
    LL res = 1;
    for(int i=0; i<n; i++)
        res = res * 2;
    return res;
}

int main()
{
    init();
    a[0] = 0;
    s[0] = 3;

    for(int i=1; i<51; i++)
    {
        a[i] = pow2(i) - a[i-1];
        // printf("%lld ", a[i]);
    }
    // printf("\n");
    for(int i=1; i<51; i++)
    {
        s[i] = 3*pow2(i) - 3*a[i-1];
        // printf("%lld ", s[i]);
    }
    // printf("\n");

    int n;
    while(scanf("%d", &n) != EOF)
    {
        printf("%lld\n", s[n-1]);
    }



    return 0;
}