Description
给出一长度为 n n 的序列,定义 Bi=∑i∤jAj,i≥2 B i = ∑ i ∤ j A j , i ≥ 2 ,求 B2,...,Bn B 2 , . . . , B n
Input
第一行一整数 T T 表示用例组数,每组用例输入一整数表示序列长度,之后输入 n n 个整数
(1≤T≤20,2≤n≤105,1≤Ai≤109) ( 1 ≤ T ≤ 20 , 2 ≤ n ≤ 10 5 , 1 ≤ A i ≤ 10 9 )
Output
输出 B2,...,Bn B 2 , . . . , B n
Sample Input
2
4
1 2 3 4
4
1 4 2 3
Sample Output
3 4 3
2 4 4
Solution
对于一个 i i ,是其倍数的最多 ⌊ni⌋ ⌊ n i ⌋ 个,把 A A 值从大到小排序,对每个,从大到小考虑每个 A A 值的编号,如果一个编号不能被整除那么这个值就是 Bi B i 了,这样最多 ⌊ni⌋ ⌊ n i ⌋ 次就可以求出 Bi B i ,总时间复杂度 O(nlog2n) O ( n l o g 2 n )
Code
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=100001;
int T,n;
struct node
{
int v,id;
bool operator<(const node&b)const
{
return v<b.v;
}
}a[maxn];
int b[maxn];
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i].v),a[i].id=i;
sort(a+1,a+n+1);
for(int i=n;i>=2;i--)
{
for(int j=n;j>=1;j--)
if(a[j].id%i!=0)
{
b[i]=a[j].v;
break;
}
}
for(int i=2;i<=n;i++)printf("%d%c",b[i],i==n?'\n':' ');
}
return 0;
}