题解:CF1968C Assembly via Remainders
概述给定长度为 n 减 1 的数列 x,构造长度为 n 的数列 a,满足 x_i 等于 a_i 对 a_{i-1} 取模。令 a_i 等于 a_{i-1} 加 x_i,则 a_i 对 a_{i-1} 取模化为 x_i 对 a_{i-1} 取模;只要首项足够大(大于所有 x_i),取模结果就等于 x_i 本身。由于 x_i 不超过 500 且 a_i 不超过 10 的 9 次方,取一个较大的首项逐项累加即可。
给定长度为 n−1 的数列 xi,构造长度为 n 的数列 ai,满足 xi=aimodai−1。
令:
ai=ai−1+xi
则:
xi=aimodai−1=(ai−1+xi)modai−1=ximodai−1
不难发现,当 ai−1 较大时即可满足条件。
由于 xi≤500,ai≤109,所以不妨令 a1 为一个较大的数。
#include <bits/stdc++.h>
using namespace std;
const int N=200005;
int a[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
a[1]=100526;
for(int i=2;i<=n;i++)
{
cin>>a[i];
a[i]+=a[i-1];
}
for(int i=1;i<=n;i++)
{
cout<<a[i]<<' ';
}
cout<<'\n';
}
return 0;
}