CodeForces Round #134(217B) - Blackboard Fibonacci

来源:岁月联盟 编辑:exp 时间:2012-09-01

本题的关键是抓住在过程中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;