1 条题解
-
0
自动搬运
来自洛谷,原作者为

namespace_std
万物皆可构造。搬运于
2025-08-24 22:15:19,当前版本为作者最后更新于2020-01-01 18:25:15,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
构造的思路是爆搜出来的...
经过推导(或者搜索),我们发现:
令 ( 无限循环),当 时一定存在且仅存在 个本质不同的回文串。
同时,又由于当串为 时显然本质不同的回文子串个数为 。
我们发现,当字符串长度 时 的情况才存在解, 而且如果 ,并且 ,一定无解。
又由于每在的开头插入一个 ,就会多出一个回文串 ,所以我们可以:
对于 ,我们只需要判断是否满足 。
对于 ,特判 。这个可以搜一下或者直接手玩。
对于 ,我们特判掉 和 ,然后记 ,显然此时有 。
于是拼接一个长度为 的全 串和一个长度为 的形如 的串即可。
AC代码:
#include<cstdio> #include<cstdlib> int n,m; char v[1111111]; void constr(int n,int m) { register int i; if(m==n) { puts("Yes"); for(i=1;i<=n;i++)putchar('0'); puts(""); return; }if(n==8&&m==7)return(void)puts("Yes\n00101100"); if(m<8)return(void)puts("No"); int d=n-m+8; puts("Yes"); for(i=1;i<=d;i+=6)v[i]='0'; for(i=2;i<=d;i+=6)v[i]='0'; for(i=4;i<=d;i+=6)v[i]='0'; for(i=3;i<=d;i+=6)v[i]='1'; for(i=5;i<=d;i+=6)v[i]='1'; for(i=6;i<=d;i+=6)v[i]='1'; for(i=d+1;i<=n;i++)putchar('0'); v[d+1]=0; puts(v+1); } void exec() { scanf("%d%d",&n,&m); constr(n,m); } int main() { int T; scanf("%d",&T); while(T--)exec(); }
- 1
信息
- ID
- 4881
- 时间
- 1000ms
- 内存
- 500MiB
- 难度
- 6
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者