description: Paprika loves permutations. She has an array a_1, a_2, ..., a_n. She wants to make the array a permutation of integers 1 to n.
  
  In order to achieve this goal, she can perform operations on the array. In each operation she can choose two integers i (1 ≤ i ≤ n) and x (x > 0), then perform a_i := a_i mod x (that is, replace a_i by the remainder of a_i divided by x). In different operations, the chosen i and x can be different.
  
  Determine the minimum number of operations needed to make the array a permutation of integers 1 to n. If it is impossible, output -1.
  
  A permutation is an array consisting of n distinct integers from 1 to n in arbitrary order. For example, [2,3,1,5,4] is a permutation, but [1,2,2] is not a permutation (2 appears twice in the array) and [1,3,4] is also not a permutation (n=3 but there is 4 in the array).
  
  Input
  
  Each test contains multiple test cases. The first line contains a single integer t (1 ≤ t ≤ 10^4) — the number of test cases. Description of the test cases follows.
  
  The first line of each test case contains an integer n (1 ≤ n ≤ 10^5).
  
  The second line of each test case contains n integers a_1, a_2, ..., a_n. (1 ≤ a_i ≤ 10^9).
  
  It is guaranteed that the sum of n over all test cases does not exceed 2 ⋅ 10^5.
  
  Output
  
  For each test case, output the minimum number of operations needed to make the array a permutation of integers 1 to n, or -1 if it is impossible.
  
  Example
  
  Input
  
  
  4
  2
  1 7
  3
  1 5 4
  4
  12345678 87654321 20211218 23571113
  9
  1 2 3 4 18 19 5 6 7
  
  
  Output
  
  
  1
  -1
  4
  2
  
  Note
  
  For the first test, the only possible sequence of operations which minimizes the number of operations is: 
  
    * Choose i=2, x=5. Perform a_2 := a_2 mod 5 = 2. 
  
  
  
  For the second test, it is impossible to obtain a permutation of integers from 1 to n.
solution: import java.io.BufferedReader;
  import java.io.InputStreamReader;
  import java.util.StringTokenizer;
  import java.util.*;
  import java.io.*;
  public class Main {
      // Graph
      // prefix sums
      //inputs
      public static void main(String args[])throws Exception{
          Input sc=new Input();
          precalculates p=new precalculates();
          StringBuilder sb=new StringBuilder();
          int t=sc.readInt();
          for(int f=0;f<t;f++){
              int n=sc.readInt();
              int a[]=sc.readArray();
              Arrays.sort(a);
              boolean b=false;
              HashSet<Integer> set=new HashSet<>();
              ArrayList<Integer> lst=new ArrayList<>();
  
              for(int i=0;i<n;i++){
                  if(a[i]>=1 && a[i]<=n && !set.contains(a[i])){
                      set.add(a[i]);
                  }else {
                  lst.add(a[i]);
                  }
              }
              Collections.sort(lst);
              int j=0;
              int count=0;
              for(int i=1;i<=n;i++){
                  while(set.contains(i) && i<=n){
                      i++;
                  }
                  if(i<=n){
                      if(lst.get(j)%(lst.get(j)-i)!=i){
                          b=true;
                          break;
                      }else{
                          count++;
                      }
                      j++;
                  }
              }
              if(b){
                  sb.append("-1\n");
              }else{
                  sb.append(count+"\n");
              }
          }
  
          System.out.print(sb);
      }
  }
  class Input{
      BufferedReader br;
      StringTokenizer st;
      Input(){
          br=new BufferedReader(new InputStreamReader(System.in));
          st=new StringTokenizer("");
      }
      public int[] readArray() throws Exception{
          st=new StringTokenizer(br.readLine());
          int a[]=new int[st.countTokens()];
          for(int i=0;i<a.length;i++){
              a[i]=Integer.parseInt(st.nextToken());
          }
          return a;
      }
      public long[] readArrayLong() throws Exception{
          st=new StringTokenizer(br.readLine());
          long a[]=new long[st.countTokens()];
          for(int i=0;i<a.length;i++){
              a[i]=Long.parseLong(st.nextToken());
          }
          return a;
      }
      public int readInt() throws Exception{
          st=new StringTokenizer(br.readLine());
          return Integer.parseInt(st.nextToken());
      }
      public long readLong() throws Exception{
          st=new StringTokenizer(br.readLine());
          return Long.parseLong(st.nextToken());
      }
      public String readString() throws Exception{
          return br.readLine();
      }
      public int[][] read2dArray(int n,int m)throws Exception{
          int a[][]=new int[n][m];
          for(int i=0;i<n;i++){
              st=new StringTokenizer(br.readLine());
              for(int j=0;j<m;j++){
                  a[i][j]=Integer.parseInt(st.nextToken());
              }
          }
          return a;
      }
  }
  class precalculates{
      public long gcd(long p, long q) {
          if (q == 0) return p;
          else return gcd(q, p % q);
      }
      public int[] prefixSumOneDimentional(int a[]){
          int n=a.length;
          int dp[]=new int[n];
          for(int i=0;i<n;i++){
              if(i==0)
                  dp[i]=a[i];
              else
                  dp[i]=dp[i-1]+a[i];
          }
          return dp;
      }
      public int[] postSumOneDimentional(int a[]) {
          int n = a.length;
          int dp[] = new int[n];
          for (int i = n - 1; i >= 0; i--) {
              if (i == n - 1)
                  dp[i] = a[i];
              else
                  dp[i] = dp[i + 1] + a[i];
          }
          return dp;
      }
      public int[][] prefixSum2d(int a[][]){
          int n=a.length;int m=a[0].length;
          int dp[][]=new int[n+1][m+1];
          for(int i=1;i<=n;i++){
              for(int j=1;j<=m;j++){
                  dp[i][j]=a[i-1][j-1]+dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1];
              }
          }
          return dp;
      }
      public long pow(long a,long b){
          long mod=1000000007;
          long ans=0;
          if(b<=0)
              return 1;
          if(b%2==0){
              ans=pow(a,b/2)%mod;
              return ((ans%mod)*(ans%mod))%mod;
          }else{
              return ((a%mod)*(ans%mod))%mod;
          }
      }
  
  }
  class GraphInteger{
      HashMap<Integer,vertex> vtces;
      class vertex{
          HashMap<Integer,Integer> children;
          public vertex(){
              children=new HashMap<>();
          }
      }
      public GraphInteger(){
          vtces=new HashMap<>();
      }
      public void addVertex(int a){
          vtces.put(a,new vertex());
      }
      public void addEdge(int a,int b,int cost){
          if(!vtces.containsKey(a)){
              vtces.put(a,new vertex());
          }
          if(!vtces.containsKey(b)){
              vtces.put(b,new vertex());
          }
          vtces.get(a).children.put(b,cost);
  //        vtces.get(b).children.put(a,cost);
      }
      public boolean isCyclicDirected(){
          boolean isdone[]=new boolean[vtces.size()+1];
          boolean check[]=new boolean[vtces.size()+1];
          for(int i=1;i<=vtces.size();i++) {
              if (!isdone[i] && isCyclicDirected(i,isdone, check)) {
                  return true;
              }
          }
          return false;
      }
      private boolean isCyclicDirected(int i,boolean isdone[],boolean check[]){
          if(check[i])
              return true;
          if(isdone[i])
              return false;
          check[i]=true;
          isdone[i]=true;
          Set<Integer> set=vtces.get(i).children.keySet();
          for(Integer ii:set){
              if(isCyclicDirected(ii,isdone,check))
                  return true;
          }
          check[i]=false;
          return false;
      }
  }
  class union_find {
      int n;
      int[] sz;
      int[] par;
  
      union_find(int nval) {
          n = nval;
          sz = new int[n + 1];
          par = new int[n + 1];
          for (int i = 0; i <= n; i++) {
              par[i] = i;
              sz[i] = 1;
          }
      }
  
      int root(int x) {
          if (par[x] == x)
              return x;
          return par[x] = root(par[x]);
      }
  
      boolean find(int a, int b) {
          return root(a) == root(b);
      }
  
      int union(int a, int b) {
          int ra = root(a);
          int rb = root(b);
          if (ra == rb)
              return 0;
          if(a==b)
              return 0;
          if (sz[a] > sz[b]) {
              int temp = ra;
              ra = rb;
              rb = temp;
          }
          par[ra] = rb;
          sz[rb] += sz[ra];
          return 1;
      }
  }
  
  
  
  
  
  
  