#include #include #include #include using namespace std; // ユークリッドの互除法による gcd の計算 long long gcd(long long a, long long b){ while(b){ a %= b; swap(a,b); } return a; } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int T; cin >> T; while(T--){ int N, K; long long X; cin >> N >> K >> X; vector H(N); for (int i = 0; i < N; i++){ cin >> H[i]; } // ① 各 H[i] の余りが同じかチェック long long rem = H[0] % X; bool possible = true; for (int i = 0; i < N; i++){ if(H[i] % X != rem) { possible = false; break; } } if(!possible){ cout << "No\n"; continue; } // ② H[i] = rem + X*A[i] とおく. vector A(N); for (int i = 0; i < N; i++){ A[i] = (H[i] - rem) / X; } // ③ 不変量:添字の余り(mod d)ごとの総和が操作後も同じ差でしか変わらない. // d = gcd(N, K) とおく. int d = (int)gcd(N, K); // 各クラス r (0 <= r < d) について,総和と個数を求める. vector sumClass(d, 0); vector countClass(d, 0); for (int i = 0; i < N; i++){ int cls = i % d; sumClass[cls] += A[i]; countClass[cls]++; } // 最終的に全体が t にそろうとすれば,各クラスの和は t * (そのクラスの個数) になるはず. // つまり,任意のクラス r, s について,平均 (sumClass[r] / countClass[r]) が同じでなければならない. for (int r = 1; r < d; r++){ // 整数同士の比較のため,交差掛けして比較 if(sumClass[r] * (long long)countClass[0] != sumClass[0] * (long long)countClass[r]){ possible = false; break; } } cout << (possible ? "Yes" : "No") << "\n"; } return 0; }