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";
		}
	}
}