A 题解的token计算
直接算即可。
参考代码
void solve() {
ld n;
cin >> n;
cout << 150.0 * log(n) << "\n";
}
B 76修地铁
直接算即可。
参考代码
void solve() {
int n;
int a, b, c, d;
cin >> n;
a = n / 5 * 2;
b = (n + 5) / 10;
c = n / 20 * 3;
d = (n - n / 20) * 2;
cout << a << " " << b << " " << c << " " << d << "\n";
}
C 76选数
显然每个数位都能放上1。
参考代码
void solve() {
ll n;
cin >> n;
cout << (1ll << __lg(n) + 1) - 1 << "\n";
}
D 76构造
用2的幂单独作为区间组成k,剩下的数字组成一个区间,gcd为1。
参考代码
void solve() {
int n, m;
cin >> n >> m;
if ((m & 1) == 0) {
cout << -1 << "\n";
return;
}
for (int b = 0; b < 31; ++b) {
if ((m >> b & 1LL) && (1LL << b) > n) {
cout << -1 << "\n";
return;
}
}
vector<int> bits;
for (int b = 1; (1LL << b) <= n; ++b) {
if (m & (1LL << b)) {
bits.pb(b);
}
}
vector<bool> used(n + 1, 0);
for (int b : bits) {
used[1 << b] = 1;
}
vector<int> perm;
for (int b : bits) {
perm.pb(1 << b);
}
for (int x = 1; x <= n; ++x) {
if (!used[x]) {
perm.pb(x);
}
}
for (int i = 0; i < n; ++i) {
cout << perm[i] << " ";
}
cout << "\n";
int k = bits.size() + 1;
cout << k << "\n";
for (int i = 1; i <= bits.size(); ++i) {
cout << i << " " << i << "\n";
}
cout << bits.size() + 1 << " " << n << "\n";
}
E qcjj寄快递
计算题,直接算即可。
参考代码
void solve() {
int n;
cin >> n;
vector<pair<ld, ld>> cor(n);
for (int i = 0; i < n; ++i) {
cin >> cor[i].fi >> cor[i].se;
}
ld tot = 0;
for (int i = 1; i < n; ++i) {
ld dx = cor[i].fi - cor[i - 1].fi;
ld dy = cor[i].se - cor[i - 1].se;
ld dis = sqrt(dx * dx + dy * dy);
if (dis * log(2.0) > 1.0) {
ld k = log(dis * log(2.0)) / log(2.0);
tot += 2 * k + 2 / log(2.0);
} else {
tot += 2 * dis;
}
}
cout << tot << "\n";
}
F 幂中幂plus
显然会出现循环,只有mod个状态,模拟到出现重复数字即可。
参考代码
void solve() {
ll a, c0, mod;
cin >> a >> c0 >> mod;
int q;
cin >> q;
vector<ll> qs(q);
for (int i = 0; i < q; ++i) {
cin >> qs[i];
}
if (mod == 1) {
while (q--) {
cout << 0 << "\n";
}
return;
}
vector<ll> c, sum, pos(mod, -1);
ll cur = c0;
int idx = 0, st = -1, len = -1;
while (true) {
ll v = ksm(a, cur, mod);
if (pos[v] == -1) {
pos[v] = idx++;
c.pb(v);
sum.pb(((sum.empty() ? 0 : sum.back()) + v) % mod);
cur = v;
} else {
st = pos[v];
len = idx - st;
break;
}
}
int pre = st;
int cyc = len;
ll asum = (sum[pre + cyc - 1] - (pre ? sum[pre - 1] : 0) + mod) % mod;
for (auto v : qs) {
if (v <= pre) {
cout << sum[v - 1] << "\n";
} else {
ll cnt = (v - pre) / cyc, rem = (v - pre) % cyc;
ll ans = pre ? sum[pre - 1] : 0;
ans = (ans + (cnt % mod) * asum) % mod;
if (rem) {
ll extra = (sum[pre + rem - 1] - (pre ? sum[pre - 1] : 0) + mod) % mod;
ans = (ans + extra) % mod;
}
cout << ans << "\n";
}
}
}