看了其他人博客,貌似i个盘子的方案数满足 f[i] = f[i-1] * x + y
???????
神来之笔
貌似没有找到严格的证明……
牛逼……
如果这样的话暴力求出x和y然后递推完事
#include<cstdio>
#include<stack>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std;
int s[10][2];
stack<int> st[3];
bool judge(int a, int b, int pre)
{
if(st[a].empty() || st[a].top() == pre) return false;
if(st[b].empty() || st[a].top() < st[b].top()) return true;
return false;
}
int solve(int n)
{
REP(i, 0, 3)
while(!st[i].empty())
st[i].pop();
for(int i = n; i >= 1; i--) st[0].push(i);
int ret = 0, pre = -1;
while(1)
{
if(st[1].size() == n || st[2].size() == n) return ret;
REP(i, 0, 6)
{
int a = s[i][0], b = s[i][1];
if(judge(a, b, pre))
{
pre = st[a].top();
st[b].push(pre);
st[a].pop();
ret++;
break;
}
}
}
}
int main()
{
int n, f2, f3;
int x, y;
while(~scanf("%d", &n))
{
REP(i, 0, 6)
{
char str[5];
scanf("%s", str);
s[i][0] = str[0] - 'A';
s[i][1] = str[1] - 'A';
}
f2 = solve(2); f3 = solve(3);
x = (f3 - f2) / (f2 - 1);
y = f2 - x;
long long ans = 1;
REP(i, 2, n + 1)
ans = ans * x + y;
printf("%lld
", ans);
}
return 0;
}