CodeForces 379 D. New Year Letter
枚举开头结尾的字母,枚举ac的个数,总AC个数就是两个Fibonacci数列的和。。。。。
#include <iostream> #include <cstring> #include <cstdio> using namespace std; int dp[120]; char sa[12000],sb[12000]; long long int fib[120]; int getMAX(char s,char e,int l) { if(l==1) { return 0; } if(l==2) { if(s=='A'&&e=='C') return 1; else return 0; } if(l==3) { if(s=='A'||e=='C') return 1; else return 0; } if(l>=4) { if(s=='A'&&e=='C') return (l-4)/2+2; else if((s!='A'&&e=='C')||(s=='A'&&e!='C')) return (l-3)/2+1; else return (l-2)/2; } } long long int getfibK(int a,int b,int x) { fib[0]=0;fib[1]=a;fib[2]=b; for(int i=3;i<=x;i++) { fib[i]=fib[i-1]+fib[i-2]; } if(fib[x]>1e9) return -1; return fib[x]; } int main() { int k,x,n,m; scanf("%d%d%d%d",&k,&x,&n,&m); char s1,e1,s2,e2; for(s1='A';s1<='C';s1++) { for(e1='A';e1<='C';e1++) { if(n==1&&s1!=e1) continue; for(s2='A';s2<='C';s2++) { for(e2='A';e2<='C';e2++) { if(m==1&&s2!=e2) continue; memset(dp,0,sizeof(dp)); char ls1=s1,le1=e1,ls2=s2,le2=e2; for(int i=3;i<=k;i++) { dp[i]=dp[i-2]+(le1=='A'&&ls2=='C')+dp[i-1]; char ts=ls2; ls2=ls1; ls1=ts;le1=le2; } long long int tx=dp[k]; if(tx>x) continue; int MaxS1=getMAX(s1,e1,n),MaxS2=getMAX(s2,e2,m); for(int i=0;i<=MaxS1;i++) { for(int j=0;j<=MaxS2;j++) { long long int ty=getfibK(i,j,k); if(ty<0) continue; if(tx+ty==(long long int )x) { int posA=i,posB=j; int cnta=1,cntb=1; sa[0]=s1;sa[n-1]=e1; sb[0]=s2;sb[m-1]=e2; if(n!=1) { while(posA--) { if(cnta==1&&sa[0]=='A') { sa[cnta++]='C'; } else { sa[cnta++]='A'; sa[cnta++]='C'; } } for(int ck=cnta;ck<n-1;ck++) { sa[ck]='B'; } } if(m!=1) { while(posB--) { if(cntb==1&&sb[0]=='A') { sb[cntb++]='C'; } else { sb[cntb++]='A'; sb[cntb++]='C'; } } for(int ck=cntb;ck<m-1;ck++) { sb[ck]='B'; } } printf("%s\n",sa); printf("%s\n",sb); return 0; } } } } } } } printf("Happy new year!\n"); return 0; }
posted on 2014-01-06 16:50 love so much 阅读(257) 评论(0) 编辑 收藏 举报