对于每个 ai ,令 ri=aimodi ,所以 bimodi=i−ri 。
所以考虑 bi ,就枚举从 i−ri 开始,i×2−ri,i×3−ri,... ,最多枚举到 106 即可。
时间复杂度:O(106×logn)
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; ++i) cin >> a[i];
vector<int> b(n);
const int MAXN = 1000000;
vector<int> vis(MAXN + 1, 0);
int cnt = 0;
// 本质就是对于每个值找到还未被使用的最小值即可
for (int i = 0; i < n; ++i) {
int r = (i + 1) - a[i] % (i + 1);
for (int j = r; j <= MAXN; j += i + 1) {
if (!vis[j]) {
b[i] = j;
vis[j] = 1;
cnt += 1;
break;
}
}
}
for (int i = 0; i < n; ++i) cout << b[i] << " \n"[i + 1 == n];
return 0;
}
string = input()
n = len(string)
res = 0
for i in range(n-3):
if string[i:i+4] == 'tzzt':
res += (i+1)*(n-i-3)
print(res)
n = int(input())
nums = list(map(int, input().split()))
def solve():
res = []
pre = set()
for i, a in enumerate(nums):
b = (i + 1) - a % (i + 1)
if b < 1:
b += i + 1
while b in pre and b < 10 ** 9:
b += (i + 1)
res.append(b)
pre.add(b)
print(*res, sep = " ")
solve()
小红有一个长度为 n 的数组 a ,他想让你用这个数组 a 来构造一个长度同样为 n 的数组 b 。
你需要使得这个数组 b 的每个元素值都在 [1,109] 之间,且所有元素各不相同。
此外,你还需要使得 (ai+bi)modi=0,(1≤i≤109) 。
第一行,一个整数 n(1≤n≤105) ,表示数组的长度。
第二行,n 个数表示数组 a 的 n 个元素,第 i 个元素 ai∈[1,106]
一行,n 个数表示构造出的数组 b 。
输入
5
1 2 3 4 5
输出
1 2 3 4 5