题解: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;
}