結果
問題 |
No.2860 Heal Slimes
|
ユーザー |
|
提出日時 | 2025-02-01 20:16:36 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,218 bytes |
コンパイル時間 | 1,237 ms |
コンパイル使用メモリ | 78,540 KB |
実行使用メモリ | 6,824 KB |
最終ジャッジ日時 | 2025-02-01 20:16:45 |
合計ジャッジ時間 | 8,820 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 43 WA * 17 |
ソースコード
#include <iostream> #include <vector> #include <numeric> #include <algorithm> 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<long long> 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<long long> 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<long long> sumClass(d, 0); vector<int> 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; }