跳到主要内容
原文156 词数1 分钟

题解: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−1n-1 的数列 xix_i,构造长度为 nn 的数列 aia_i,满足 xi=ai mod ai−1x_i=a_i\bmod a_{i-1}。

解题思路​

令:

ai=ai−1+xia_i=a_{i-1}+x_i

则:

xi=ai mod ai−1=(ai−1+xi) mod ai−1=xi mod ai−1\begin{aligned} x_i & =a_i\bmod a_{i-1} \\ & =(a_{i-1}+x_i)\bmod a_{i-1} \\ & =x_i\bmod a_{i-1} \end{aligned}

不难发现,当 ai−1a_{i-1} 较大时即可满足条件。

由于 xi≤500,ai≤109x_i\le 500,a_i\le 10^9,所以不妨令 a1a_1 为一个较大的数。

参考代码​

349 Bcpp
#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;
}