题意
三个数字N,K,S,构造一个长度为N的序列B,要求如下:
- $B_i \in {-1,0,1}$
- $\sum_{i=1}^N B_i * K^{i-1}=S$
输出任意一种序列,如果没有输出-2。
思路
通过观察$\sum_{i=1}^N B_i * K^{i-1}=S $
可以得到$ S = B1 + \sum_{i=2}^N B_i * K^{i-1} $,即
$$ S\equiv B_1 \quad (mod \ K) $$
所以通过S可以确定B1的值,然后通过一些简单的代数可以得到
$$ \frac{S-B1}{K} = B2+\sum_{i=3}^N B_i * K^{i-2} $$
即
$$\frac{S-B_1}{K} \equiv B_2 \quad (mod \ K) $$
所以可以确定B2的值,以此类推可以得到所有B的值,如果中途出现越界情况,直接返-2即可。
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
##include "bits/stdc++.h"
##ifdef LOCAL ##include "algo/debug.h" ##else ##define debug(...) 42 ##endif
void solve() { int n, K; long long S; std::cin >> n >> K >> S; std::vector<int> B(n); bool ok = true; for (int i = 0; i < n; i++) { if (S % K == 0) { S /= K; } else if ((S - 1) % K == 0) { S = (S - 1) / K; B[i] = 1; } else if ((S + 1) % K == 0) { S = (S + 1) / K; B[i] = -1; } else { ok = false; break ; } } if (!ok S != 0) { std::cout << -2 << '\n'; } else { for (int i = 0; i < n; i++) { std::cout << B[i] << " \n"[i == n - 1]; } } }
int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr);
int _; std::cin >> _; while (_--) { solve(); }
return 0; }
|
本文作者:jujimeizuo
本文地址: https://blog.jujimeizuo.cn/2023/01/05/codechef-starters-72-div2-no-sequence/
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0 协议。转载请注明出处!