Inversion
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 602 Accepted Submission(s): 401
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主要是看懂公式: maxi∤jAji不能整除j由此有两种方式解决,可以用结构体排序,将权值大的排在前面,再对下标进行筛选还可以直接枚举,但有一个优化,先对a选出最大的数和坐标,然后判断maxa是否满足,不满足再从1~n中枚举筛选#include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <queue> #include <iostream> using namespace std; #define N 100010 #define LL long long LL a[N]; LL b[N]; int main() { int t; LL n; scanf("%d",&t); while(t--) { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); scanf("%lld",&n); LL maxa=0; LL maxa_i=0; for(int i=1; i<=n; i++) { scanf("%lld",&a[i]); if(a[i]>maxa) { maxa=a[i]; maxa_i=i; } } //int maxx; for(int i=2;i<=n+1;i++) { if(maxa_i%i==0) { LL mm=0; for(int j=1;j<=n;j++) { if(j%i==0)continue; if(a[j]>mm) { mm=a[j]; } } b[i]=mm; } else b[i]=maxa; } for(int i=2;i<n;i++) { cout<<b[i]<<' '; } cout<<b[n]<<endl; } return 0; }
maxi∤jAj
,
i≥2
.