[ARC122E] Increasing LCMs【归纳构造】
[ARC122E] Increasing LCMs
给定序列
,构造一种重新排序的方案使得其前缀 LCM 严格递增。
考虑归纳构造(倒序构造)。
对于
引理: 一个序列合法,那么其任意子序列都合法。
很好感性理解,理性证明的话,考虑
回到原问题,我们要证明这样任意选择,不会使得答案的总数减少。考虑一个可能成为最终答案的答案,满足最后一项不是
经典套路: 求一串数的 lcm 常常因为太大无法保存,如果值域较小可以存质因数的指数,但本题值域高达
#include <bits/stdc++.h>
#define int long long
#define pii pair<int,int>
#define fi first
#define se second
using namespace std;
int read(){
char c=getchar();int h=0,tag=1;
while(!isdigit(c)) tag=(c=='-'?-1:1),c=getchar();
while(isdigit(c)) h=(h<<1)+(h<<3)+(c^48),c=getchar();
return h*tag;
}
void fil(){
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
}
const int N=105;
int a[N],b[N];
int lcm(int a,int b){
return a/__gcd(a,b)*b;
}
void work(int n) {
if(n==1) {
b[1]=a[1];
return ;
}
for(int i=1;i<=n;i++) {
int res=1;
for(int j=1;j<=n;j++) {
if(i==j) continue;
res=lcm(res,__gcd(a[i],a[j]));
}
if(res<a[i]) {
b[n]=a[i];
for(int j=i;j<=n-1;j++) a[j]=a[j+1];
work(n-1);
return ;
}
}
}
signed main(){
// fil();
int n=read();
for(int i=1;i<=n;i++) a[i]=read();
work(n);
if(b[1]) {
puts("Yes");
for(int i=1;i<=n;i++) cout<<b[i]<<" ";
cout<<endl;
return 0;
}
puts("No");
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现