Inversion
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 30 Accepted Submission(s): 18
Problem Description
Give an array A, the index starts from 1.
Now we want to know Bi=maxi∤jAj , i≥2 .
Now we want to know Bi=maxi∤jAj , i≥2 .
Input
The first line of the input gives the number of test cases T; T test cases follow.
Each case begins with one line with one integer n : the size of array A.
Next one line contains n integers, separated by space, ith number is Ai .
Limits
T≤20
2≤n≤100000
1≤Ai≤1000000000
∑n≤700000
Each case begins with one line with one integer n : the size of array A.
Next one line contains n integers, separated by space, ith number is Ai .
Limits
T≤20
2≤n≤100000
1≤Ai≤1000000000
∑n≤700000
Output
For each test case output one line contains n-1 integers, separated by space, ith number is
Bi+1
.
Sample Input
2 4 1 2 3 4 4 1 4 2 3
Sample Output
3 4 3 2 4 4
Source
题意
给定ai , i∈[1,n] 定义bi , i∈[2,n+1]
Bi=maxi∤jAj
,
i≥2
.
i不是j的因子
将ai排序,倒着找,第一个不是i的倍数的j对应的aj就是bi
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long LL;
const int maxn = 100000 + 10;
struct data{
LL val;
int pos;
}a[maxn];
int cmp1(const data a,const data b){
return a.val < b.val;
}
LL b[maxn];
int main()
{
int t;
scanf("%d", &t);
while (t > 0)
{
t--;
int n;
scanf("%d",&n);
for(int i = 0;i<n;++i){
scanf("%lld",&a[i].val);
a[i].pos = i+1;
}
sort(a,a+n, cmp1);
for(int i = 2;i<=n;++i){
for(int j = n-1;j>=0;--j){
if(a[j].pos%i) {b[i] = a[j].val;break;}
}
}
for(int i = 2;i<=n;++i){
if(i!=2) printf(" ");
printf("%lld",b[i]);
}
puts("");
}
return 0;
}