uva 10560 - Minimum Weight(数论)

时间:2022-12-08 12:29:58

题目连接:uva 10560 - Minimum Weight

题目大意:给出n,问说至少须要多少个不同重量的砝码才干称量1~n德重量,给出所选的砝码重量,而且给出k,表示有k个重量须要用上述所选的砝码測量。

解题思路:重量为1的砝码肯定要选,它能够表示到1的重量,那么下一个砝码的重量肯定选择3(2∗1+1),这样1,3分别能够用一个砝码表示,而2,4分别为3-1和3+1,这样1~4的重量也都能够表示。于是有公式ai=si−1∗2+1。

#include <cstdio>
#include <cstring>
#include <vector> using namespace std;
typedef unsigned long long ll; ll n, S;
vector<ll> ans; void init (ll n) {
S = 0;
ans.clear(); while (S < n) {
ll u = S * 2 + 1;
ans.push_back(u);
S += u;
}
printf("%lu", ans.size());
for (int i = 0; i < ans.size(); i++)
printf(" %lld", ans[i]);
printf("\n");
} void solve () {
ll k, s = S;
scanf("%lld", &k); int sign = 1, flag = 0;
for (int i = ans.size() - 1; i >= 0; i--) {
ll t = (s - 1) / 3; s -= ans[i];
// printf("%lld %lld %lld\n", ans[i], s, k);
if (k <= t)
continue; if (flag)
printf("%c", sign > 0 ? '+' : '-'); if (k < ans[i]) {
sign *= -1;
k = ans[i] - k;
} else {
k = k - ans[i];
}
flag = 1;
printf("%lld", ans[i]);
}
printf("\n");
} int main () {
int k;
while (scanf("%lld%d", &n, &k) == 2 && n + k) {
init(n);
for (int i = 0; i < k; i++)
solve();
}
return 0;
}