ABC 363 F - Palindromic Expression 题解
下文中提到的数字都不包含 0,注意把含 0 的数字特判掉。
反转指各个数位倒过来,比如 114514
反转过后就是 415411
。
注意到,答案一定是这样:数列
比如:2*57*184481*75*2
,其中的数列 2 57
,中间的回文就是 184481
。
搜索,先搜两边,把一个数和把它反转后的数拼成一对,如果
由于合法的对数不会太多,所以可以预处理可能出现在答案里的对,然后暴力搜索。
时间复杂度:
点击开 D
const int N=1099;
ll n,a[N]={},fan[1000099]={};
bool nozero(ll n) {
while(n) {
while(n%10==0)
return false;
n/=10;
}
return true;
}
bool ishui(ll n) {
if(!nozero(n))
return false;
int a[20]={},i,j;
while(n)
a[++a[0]]=n%10,
n/=10;
for(i=1,j=a[0];i<j;++i,--j)
if(a[i]!=a[j])
return false;
return true;
}
ll turn(ll n) {
ll ans=0;
while(n)
ans=ans*10+n%10,
n/=10;
return ans;
}
ll g[1000099]={},leftans=0;
bool solve(ll n) {
if(ishui(n)) {
leftans=n;
return true;
}
for(int i=2;i<=g[0]&&g[i]*fan[g[i]]<=n;++i)
if(n%(g[i]*fan[g[i]])==0) {
if(solve(n/(g[i]*fan[g[i]]))) {
a[++a[0]]=g[i];
return true;
}
}
return false;
}
int main()
{
ll i;
read(n);
for(i=1;i<=1e6;++i) {
fan[i]=turn(i);
if(i<=fan[i]&&n%i==0&&(n/i)%fan[i]==0&&nozero(i))
g[++g[0]]=i;
}
if(solve(n)) {
for(i=1;i<=a[0];++i)
printf("%lld*",a[i]);
printf("%lld",leftans);
for(i=a[0];i;--i)
printf("*%lld",fan[a[i]]);
printf("\n");
} else printf("-1\n");
return 0;
}
标签:
练习
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下