CodeForces Round #134(217B) - Blackboard Fibonacci
本题的关键是抓住在过程中T,B两数的关系...如果当前的操作是'T'...那么T=T+B..显然T>B..如果当前操作是'B'...做的操作是B=T+B..显然B>T...所以要是知道了最后的(T,B)..那么就可以倒推出唯一的序列...只要判断下T,B的大小..就知道当前是要写'T',还是'B'了..
枚举最后的(T,B)...倒推..找出最优解...
Program:
[cpp]
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<queue>
#include<stack>
#define ll long long
#define oo 1000000000
#define pi acos(-1)
using namespace std;
int n,m,i,l,r,ansn;
char ans[1000006],temp[1000006];
void update(int t,int b)
{
int len=1,i,k;
while (t!=b && t>=0 && b>=0)
if (t>b)
{
temp[len++]='T';
t-=b;
}else
{
temp[len++]='B';
b-=t;
}
if (len!=n || t!=1) return;
temp[len]='T';
k=0;
for (i=1;i<len;i++)
if (temp[i]==temp[i+1]) k++;
if (k<ansn)
{
ansn=k;
for (i=0;i<len;i++)
ans[i]=temp[len-i];
ans[len]='/0';
}
return;
}
int main()
{
while (~scanf("%d%d",&n,&m))
{
int i;
ansn=oo;
for (i=1;i<=m;i++)
{
update(i,m);
update(m,i);
}
if (ansn==oo) printf("IMPOSSIBLE/n");
else printf("%d/n%s",ansn,ans);
}
return 0;
}