fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long int ll;
  5. #define fo(i, start, end) for (ll i = start; i <= end; i++)
  6. #define pfo(i, end, start) for (ll i = end; i >= start; i--)
  7. #define all(x) x.begin(), x.end()
  8. #define sz(x) (ll)x.size()
  9. #define pb push_back
  10. #define mp make_pair
  11. #define fi first
  12. #define se second
  13. #define sortall(v) sort(all(v))
  14. #define sumv(v) accumulate(all(v), 0LL)
  15.  
  16. const int MAXN = 300000+5;
  17.  
  18. vector<int> g[MAXN + 1];
  19.  
  20. int main() {
  21. ios::sync_with_stdio(false);
  22. cin.tie(NULL);
  23.  
  24.  
  25. fo(i, 1, MAXN) {
  26. for (int j = i; j <= MAXN; j += i) {
  27. g[j].pb(i);
  28. }
  29. }
  30.  
  31. ll t;
  32. cin>>t;
  33. while(t--){
  34. ll n;
  35. cin>>n; unordered_map <ll,ll> p;
  36. fo(i,1,n){
  37. ll g;cin>>g; p[g]++;
  38. }
  39. vector <ll> dp(n+1,-1);
  40. if(p[1]>=1){
  41. dp[1] = 1;
  42. }
  43. fo(i,2,n){ll v = 1e18;
  44. for(auto u : g[i]){
  45. ll p1 = i/u;
  46. // if(i==4){
  47. // cout<<p1<<" "<<u<<"\n";
  48. // }
  49. if(dp[p1]!=-1 && dp[u]!=-1){
  50. v = min(v,dp[p1]+dp[u]);
  51. }
  52. }
  53.  
  54. if(v!=1e18){
  55. dp[i] = v;
  56. }
  57.  
  58. if(p[i]>=1){
  59. dp[i] = 1;
  60. }
  61. }
  62.  
  63. fo(i,1,n){
  64. cout<<dp[i]<<" ";
  65. }
  66.  
  67. cout<<"\n";
  68. }
  69.  
  70.  
  71.  
  72.  
  73. return 0;
  74. }
  75.  
Success #stdin #stdout 0.25s 36180KB
stdin
6
8
3 2 2 3 7 3 6 7
5
1 2 3 4 5
3
1 1 1
10
2 1 2 1 3 5 5 7 7 7
4
1 1 2 2
1
1
stdout
-1 1 1 2 -1 1 1 3 
1 1 1 1 1 
1 -1 -1 
1 1 1 2 1 2 1 3 2 2 
1 1 -1 2 
1