-
给定一个长度为 n 的序列 a ,请你构造一个序列 b ,序列 b 满足以下条件:
1.序列 b 的长度为 n
2.对于任意 i ∈[1, n],满足 ( ai+ bi ) mod i = 0
3.对于任意i ∈[1, n],满足 1 ≤bi ≤10^9
4.对于任意1≤i<j≤n,满足 bi≠ bj -
输入描述:
第—行输入一个整数 n (1 ≤n ≤105)
第二行输入n个整数,第i个为 ai (1 ≤ai≤106) -
输出描述
输出n个整数,表示答案。
若有多个不同的答案,输出所有结果。 -
输入:
5
3 4 7 8 10 -
输出:
1 6 2 4 5 -
算法步骤
输入 n。
输入 n 个整数作为序列 a。
初始化一个空的集合 used 来存储已经使用过的 bi。
初始化一个空的序列 b。
从 i = 1 开始循环到 i = n:
a. 计算当前位置的 bi = i - a[i-1],确保 bi 大于等于 1。
b. 如果 bi 已经在集合 used 中,就将 bi 增加 i,直到 bi 不在 used 中为止,以保证 bi 不会重复。
c. 将 bi 添加到集合 used 中。
d. 将 bi 添加到序列 b 中。
输出序列 b。
import java.util.*;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();long[] a = new long[n+1];long[] b = new long[n+1];for(int i=1;i<=n;i++){a[i]=scanner.nextLong();}for(int i=1;i<a.length;i++){System.out.print(a[i]+" ");}Set<Long> used = new HashSet<>();for(int i=1;i<=n;i++){long num = i - a[i];while (true) {if (num >= 1 && !used.contains(num) ) {used.add(num);b[i] = num;break;} else {num += i;}}}for(int i=1;i<b.length;i++){System.out.print(b[i]+" ");}}
}
- Set used = new HashSet<>();当作new了一个新的日志。
- 局部循环用while-break;