[CF379D](New Year Letter)
-
题意
给你k,x,n,m
你需要构造两个长为n,m的串S1,S2
有一个构造方式\(s_n\)=\(s_{n-1}\)+\(s_{n-2}\)
即字符串列为
\(s_1\)
\(s_2\)
\(s_1\)+\(s_2\)
\(s_2\)+\(s_1\)+\(s_2\)
\(s_1\)+\(s_2\)+\(s_2\)+\(s_1\)+\(s_2\)
要求使得第k个串包含x个"AC";
-
solution
设初始串为a,b
串列为
a
b
ab
bab
abbab
bababbab
abbabbababbab
bababbababbabbababbab
观察到可以组成AC的方式有a,b,ab,ba,bb五种
列个表(串列中每一项中a,b,ab,ba,bb的数量)
index | a | b | ab | ba | bb |
---|---|---|---|---|---|
1 | 1 | 0 | 0 | 0 | 0 |
2 | 0 | 1 | 0 | 0 | 0 |
3 | 1 | 1 | 1 | 0 | 0 |
4 | 1+0=1 | 1+1=2 | 1+0=1 | 0+0+(1)=1 | 0+0+(0)=0 |
5 | 1+1=2 | 1+2=3 | 1+1=2 | 1+0+(0)=1 | 0+0+(1)=1 |
6 | 1+2=3 | 2+3=5 | 1+2=3 | 1+1+(1)=3 | 1+0+(0)=1 |
7 | 2+3=5 | 3+5=8 | 2+3=5 | 1+3+(0)=4 | 1+1+(1)=3 |
规律自己去找
然后我们枚举两个串中AC子串的数量
枚举两个串的首尾字符
就可以AC辣
-
code
#include<iostream>
#include<cstdio>
#include<algorithm>
#define int long long
#define rep(a) for(int a=0;a<2;a++)//0 在首位表示C,在末尾表示A,1则反之
using namespace std;
int F[105];
int dp[105];
int a,b,c,p1,p2,p3;
int k,x,n,m;
signed main(){
scanf("%lld%lld%lld%lld",&k,&x,&n,&m);
for(int i=0;i<=n/2;i++)
for(int r=0;r<=m/2;r++)
rep(a)
rep(b)
rep(c)
rep(d){
if(i*2+a+b>n||r*2+c+d>m)continue;
int cc=(b&&c),dd=(a&&d),ee=(d&&c);
dp[1]=i,dp[2]=r,dp[3]=i+r+cc;
for(int p=4;p<=k;p++){// 大力七维枚举
dp[p]=dp[p-2]+dp[p-1];
if((p%2==0)){if(dd)dp[p]++;}
else if(ee)dp[p]++;
}
if(dp[k]==x){
if(a==1)putchar('C');
for(int p=1;p<=i;p++)putchar('A'),putchar('C');
for(int p=i*2+a+1;p<=n-b;p++)putchar('X');
if(b)putchar('A');
putchar('\n');
if(c)putchar('C');
for(int p=1;p<=r;p++)putchar('A'),putchar('C');
for(int p=r*2+c+1;p<=m-d;p++)putchar('X');
if(d)putchar('A');
putchar('\n');
return 0;
}
}
puts("Happy new year!");
}
另
如果你是从这里过来的,
请欣赏syk大佬的神仙代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int l[500005],r[500005],t[7][500005];
signed main()
{
int k,x,n,m;
scanf("%lld%lld%lld%lld",&k,&x,&n,&m);
l[1]=r[1]=1;
l[2]=r[2]=2;
t[3][1]=1;
t[4][2]=1;
for(int i=3;i<=k;i++)
{
t[1][i]=t[1][i-1]+t[1][i-2];//12
t[2][i]=t[2][i-1]+t[2][i-2];//21
t[3][i]=t[3][i-1]+t[3][i-2];//111
t[4][i]=t[4][i-1]+t[4][i-2];//12
t[5][i]=t[5][i-1]+t[5][i-2];//12
if(r[i-2]==1&&l[i-1]==2) t[1][i]++;
if(r[i-2]==2&&l[i-1]==1) t[2][i]++;
if(r[i-2]==2&&l[i-1]==2) t[5][i]++;
r[i]=r[i-1];
l[i]=l[i-2];
}
int xx=x;
for(int i=0;i<=n/2;i++)
{
int xxx=xx-t[3][k]*i;
if(xxx<0) break;
if(xxx%t[4][k]==0&&xxx/t[4][k]<=m/2)
{
for(int j=1;j<=i;j++)
{
printf("AC");
}
for(int j=i*2+1;j<=n;j++)
{
printf("B");
}
printf("\n");
for(int j=1;j<=xxx/t[4][k];j++)
{
printf("AC");
}
for(int j=xxx/t[4][k]*2+1;j<=m;j++)
{
printf("B");
}
printf("\n");
return 0;
}
}
n--,m--;
xx=x-t[1][k];
for(int i=0;i<=n/2;i++)
{
int xxx=xx-t[3][k]*i;
if(xxx<0) break;
if(xxx%t[4][k]==0&&xxx/t[4][k]<=m/2)
{
for(int j=1;j<=i;j++)
{
printf("AC");
}
for(int j=i*2+1;j<=n;j++)
{
printf("B");
}
printf("A\nC");
for(int j=1;j<=xxx/t[4][k];j++)
{
printf("AC");
}
for(int j=xxx/t[4][k]*2+1;j<=m;j++)
{
printf("B");
}
printf("\n");
return 0;
}
}
xx=x-t[2][k];
for(int i=0;i<=n/2;i++)
{
int xxx=xx-t[3][k]*i;
if(xxx<0) break;
if(xxx%t[4][k]==0&&xxx/t[4][k]<=m/2)
{
printf("C");
for(int j=1;j<=i;j++)
{
printf("AC");
}
for(int j=i*2+1;j<=n;j++)
{
printf("B");
}
printf("\n");
for(int j=1;j<=xxx/t[4][k];j++)
{
printf("AC");
}
for(int j=xxx/t[4][k]*2+1;j<=m;j++)
{
printf("B");
}
printf("A\n");
return 0;
}
}
n++,m--;
if(m>=0)
{
xx=x-t[5][k];
for(int i=0;i<=n/2;i++)
{
int xxx=xx-t[3][k]*i;
if(xxx<0) break;
if(xxx%t[4][k]==0&&xxx/t[4][k]<=m/2)
{
for(int j=1;j<=i;j++)
{
printf("AC");
}
for(int j=i*2+1;j<=n;j++)
{
printf("B");
}
printf("\nC");
for(int j=1;j<=xxx/t[4][k];j++)
{
printf("AC");
}
for(int j=xxx/t[4][k]*2+1;j<=m;j++)
{
printf("B");
}
printf("A\n");
return 0;
}
}
}
n-=2;
if(n>=0&&m>=0)
{
xx=x-t[1][k]-t[5][k];
for(int i=0;i<=n/2;i++)
{
int xxx=xx-t[3][k]*i;
if(xxx<0) break;
if(xxx%t[4][k]==0&&xxx/t[4][k]<=m/2)
{
printf("B");
for(int j=1;j<=i;j++)
{
printf("AC");
}
for(int j=i*2+1;j<=n;j++)
{
printf("B");
}
printf("A\nC");
for(int j=1;j<=xxx/t[4][k];j++)
{
printf("AC");
}
for(int j=xxx/t[4][k]*2+1;j<=m;j++)
{
printf("B");
}
printf("A\n");
return 0;
}
}
xx=x-t[2][k]-t[5][k];
for(int i=0;i<=n/2;i++)
{
int xxx=xx-t[3][k]*i;
if(xxx<0) break;
if(xxx%t[4][k]==0&&xxx/t[4][k]<=m/2)
{
printf("C");
for(int j=1;j<=i;j++)
{
printf("AC");
}
for(int j=i*2+1;j<=n;j++)
{
printf("B");
}
printf("B\nC");
for(int j=1;j<=xxx/t[4][k];j++)
{
printf("AC");
}
for(int j=xxx/t[4][k]*2+1;j<=m;j++)
{
printf("B");
}
printf("A\n");
return 0;
}
}
xx=x-t[1][k]-t[2][k]-t[5][k];
for(int i=0;i<=n/2;i++)
{
int xxx=xx-t[3][k]*i;
if(xxx<0) break;
if(xxx%t[4][k]==0&&xxx/t[4][k]<=m/2)
{
printf("C");
for(int j=1;j<=i;j++)
{
printf("AC");
}
for(int j=i*2+1;j<=n;j++)
{
printf("B");
}
printf("A\nC");
for(int j=1;j<=xxx/t[4][k];j++)
{
printf("AC");
}
for(int j=xxx/t[4][k]*2+1;j<=m;j++)
{
printf("B");
}
printf("A\n");
return 0;
}
}
}
printf("Happy new year!\n");
return 0;
}
太强辣