ABC 156 F - Modularness 解説
全完25位。嬉しいね
お気持ち
なのででよさそう。
解説
なので各クエリごとに及びをで置き換えて良い。以下ではとする。
すると数列は以下のようになる。を満たさないを数えてみる。
が以上になった時点で繰り上がり(?)が発生し、でを満たさない。またとなるようなでも満たさない。このように、繰り上がる箇所ととなるが分かれば解ける。
繰り上がりの回数は回である。なぜならより隣接二項間で2回以上繰り上がることはないため。
0の個数は自明。また、なるでは繰り上がりは発生しない。
よってで解ける。
実装
以下ソースコード(コード内では#define int long long
しています)
#define rep(i,a) for(int i=0;i<a;i++) void solve() { int k, q; cin >> k >> q; vector<int> d(k); rep (i, k) cin >> d[i]; rep (_, q) { int n, x, m; cin >> n >> x >> m; x %= m; int sum = 0; int z = 0; vector<int> D(k); rep (i, k) D[i] = d[i] % m, sum += D[i], z += (D[i] == 0); sum *= (n - 1) / k, z *= (n - 1) / k; rep (i, (n - 1) % k) sum += D[i], z += D[i] == 0; sum += x; cout << n - 1 - sum / m - z << endl; } }