#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9 + 7;
long long power(long long x, unsigned long long y, long long p = mod) {
  long long res = 1;
  x %= p;
  while (y > 0) {
    if (y & 1) res = (res * x) % p;
    y = y >> 1;
    x = (x * x) % p;
  }
  return res;
}
long long modInverse(long long a) { return power(a, mod - 2) % mod; }
long long modFactorial(long long n) {
  if (mod <= n) return 0;
  long long res = (mod - 1);
  for (long long i = n + 1; i < mod; i++) res = (res * modInverse(i)) % mod;
  return res;
}
bool millerTest(long long n, long long d) {
  int a = 2 + rand() % (n - 4);
  int x = power(a, d, n);
  if (x == 1 || x == n - 1) return true;
  while (d != n - 1) {
    x = (x * x) % n;
    d *= 2;
    if (x == 1) return false;
    if (x == n - 1) return true;
  }
  return false;
}
bool isPrime(long long n, long long k = 4) {
  if (n <= 1 || n == 4) return false;
  if (n <= 3) return true;
  int d = n - 1;
  while (d % 2 == 0) d /= 2;
  for (int i = 0; i < k; i++)
    if (!millerTest(d, n)) return false;
  return true;
}
bool isPrime_sqrtn(long long n) {
  if (n <= 1) return false;
  if (n <= 3) return true;
  if (n % 2 == 0 || n % 3 == 0) return false;
  for (long long i = 5; i * i <= n; i = i + 6)
    if (n % i == 0 || n % (i + 2) == 0) return false;
  return true;
}
vector<long long> spf;
void sieveForSpf(long long n = 1e7 + 1) {
  spf.resize(n);
  for (int i = 2; i < n; ++i) {
    if (spf[i] == 0) {
      for (int j = 1; j * i < n; j++) spf[i * j] = i;
    }
  }
}
void getFactorisation(int x, vector<long long> &factors) {
  if (spf.empty()) sieveForSpf();
  while (x != 1) {
    factors.push_back(spf[x]);
    x /= spf[x];
  }
}
vector<bool> segmentedSieve(long long L, long long R) {
  long long lim = sqrt(R);
  vector<bool> mark(lim + 1, false);
  vector<long long> primes;
  for (long long i = 2; i <= lim; ++i) {
    if (!mark[i]) {
      primes.emplace_back(i);
      for (long long j = i * i; j <= lim; j += i) mark[j] = true;
    }
  }
  vector<bool> isPrime(R - L + 1, true);
  for (long long i : primes)
    for (long long j = max(i * i, (L + i - 1) / i * i); j <= R; j += i)
      isPrime[j - L] = false;
  if (L == 1) isPrime[0] = false;
  return isPrime;
}
void SeiveOfErastosthenes(long long n, vector<int> &primes) {
  vector<bool> is_prime(n + 1, true);
  is_prime[0] = is_prime[1] = false;
  for (long long int i = 2; i * i <= n; i++) {
    if (is_prime[i]) {
      for (long long int j = i * i; j <= n; j += i) is_prime[j] = false;
    }
  }
  for (int i = 2; i < n; i++) {
    if (is_prime[i]) primes.push_back(i);
  }
}
long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
long long bin_gcd(long long a, long long b) {
  if (!a || !b) return a | b;
  unsigned shift = __builtin_ctz(a | b);
  a >>= __builtin_ctz(a);
  do {
    b >>= __builtin_ctz(b);
    if (a > b) swap(a, b);
    b -= a;
  } while (b);
  return a << shift;
}
long long lcm(long long a, long long b) { return a / bin_gcd(a, b) * b; }
long long extended_euclids_recursive(long long a, long long b, long long &x,
                                     long long &y) {
  if (b == 0) {
    x = 1;
    y = 0;
    return a;
  }
  long long x1, y1;
  long long d = extended_euclids_recursive(b, a % b, x1, y1);
  x = y1;
  y = x1 - y1 * (a / b);
  return d;
}
long long extended_euclids_iterative(long long a, long long b, long long &x,
                                     long long &y) {
  x = 1, y = 0;
  long long x1 = 0, y1 = 1, a1 = a, b1 = b;
  while (b1) {
    long long q = a1 / b1;
    tie(x, x1) = make_tuple(x1, x - q * x1);
    tie(y, y1) = make_tuple(y1, y - q * y1);
    tie(a1, b1) = make_tuple(b1, a1 - q * b1);
  }
  return a1;
}
bool find_any_solution(long long a, long long b, long long c, long long &x0,
                       long long &y0, long long &g) {
  g = extended_euclids_recursive(abs(a), abs(b), x0, y0);
  if (c % g) {
    return false;
  }
  x0 *= c / g;
  y0 *= c / g;
  if (a < 0) x0 = -x0;
  if (b < 0) y0 = -y0;
  return true;
}
long long phi(long long n) {
  long long result = n;
  for (long long i = 2; i * i <= n; i++) {
    if (n % i == 0) {
      while (n % i == 0) n /= i;
      result -= result / i;
    }
  }
  if (n > 1) result -= result / n;
  return result;
}
void phi_1_to_n(int n, vector<long long> &phi) {
  phi.resize(n + 1);
  phi[0] = 0;
  phi[1] = 1;
  for (int i = 2; i <= n; i++) phi[i] = i;
  for (int i = 2; i <= n; i++) {
    if (phi[i] == i) {
      for (int j = i; j <= n; j += i) phi[j] -= phi[j] / i;
    }
  }
}
void solve() {
  int n;
  cin >> n;
  vector<int> v(n);
  vector<bool> um(n, false);
  bool found_neg = true;
  for (int i = 0; i < n; i++) {
    cin >> v[i];
    if ((v[i] + i) % n < 0) {
      um[n + (v[i] + i) % n] = true;
    } else
      um[(v[i] + i) % n] = true;
  }
  for (bool x : um) {
    if (!x) {
      cout << "NO" << endl;
      return;
    }
  }
  cout << "YES" << endl;
}
int main() {
  ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  int t = 1;
  cin >> t;
  while (t--) {
    solve();
  }
  return 0;
}
