题解:P12408 始终

题解:P12408 始终

Link

  • 构造。
  • 考虑 \(n=2\) 的情况。显然这种情况不能同时满足 \(i\in[1,n),a_i\not=a_{i+1}\)\(\displaystyle\operatorname{lcm}^n_{i=1}a_i=\displaystyle\operatorname{lcm}^{n-1}_{i=1}|a_{i+1}-a_{i}|\)。所以无解。
  • 考虑 \(n=3\) 的情况。我们将 \(f(i)\) 记作 \(|a_{i+1}-a_{i}|\),因为要让数列中的每一项尽量小(这样才能更快的找到构造方法),所以令 \(L=\displaystyle\operatorname{lcm}^n_{i=1}a_i=\displaystyle\operatorname{lcm}^{n-1}_{i=1}|a_{i+1}-a_{i}|=6\),则 \(f(1)=1,f(2)=2\)\(f(1)=2,f(2)=3\)。这样可以让 \(L\) 的两对因数分别出现在构造出的数列和构造后求差的数列中。但 \(f(1)=1,f(2)=2\) 显然不符合,\(f(1)=2,f(2)=3\) 则符合。此时 \(a_1=1,a_2=3,a_3=6\),符合 \(\displaystyle\operatorname{lcm}^n_{i=1}a_i=\displaystyle\operatorname{lcm}^{n-1}_{i=1}|a_{i+1}-a_{i}|\)
  • 同理可以推广到 \(n >3\) 的情况。只需让 \(f(i)=3\) 即可。此时 \(i \ge 2\)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+10;
ll n,a[N]={0};
int main(){
    cin>>n;
    if(n==2){ cout<<-1; return 0;}
    a[1]=1;
    for(int i=2;i<=n;i+=2) a[i]=3;
    for(int i=3;i<=n;i+=2) a[i]=6;
    for(int i=1;i<=n;i++)  cout<<a[i]<<" ";    
    return 0;
}

posted @ 2025-05-05 23:28  M1_Byte  阅读(12)  评论(0)    收藏  举报