题目一 : a^b

思路 : 快速幂的模版

运行3ms 396KB

inline void solve() {
	ll a = read(), b = read(), p = read();
	ll res = 1;
	while (b) {
		if (b & 1) res = res * a % p;
		b >>= 1;
		a = a * a % p;
	}
	writen(res % p);
}

题目二 : Raising Modulo Numbers

思路 : 快速幂的模版

运行14ms 432KB

inline void solve() {
    ll M = read(), n = read(), res = 0;
    mod = M;
    for (int i = 1; i <= n; i ++ ) {
        ll a = read(), b = read();
        res += qmi(a, b);
    }
    writen(res % mod);
}

题目三 : 64位整数乘法

思路 : 快速幂的思想 , 将 b 进行二进制转换 , 右移一位时将 a 乘 2 即可

运行3ms 396KB

inline void solve() {
	ll a = read(), b = read(), p = read(), res = 0;
	while (b) {
		if (b & 1) res = (res + a) % p;
		b >>= 1;
		a = a * 2 % p;
	}
	writen(res);
}

题目四 : 最短Hamilton路径

思路 : 经典的旅行商问题 , 进行状态dp

运行692ms 164580KB

const int N = 20, M = 1 << N;
ll dp[M][N], w[N][N];
inline void solve() {
	ll n = read();
	for (int i = 0; i < n; i ++ ) {
		for (int j = 0; j < n; j ++ ) {
			w[i][j] = read();
		}
	}
	memset(dp, 0x3f, sizeof dp);
	dp[1][0] = 0;
	for (int i = 0; i < 1 << n; i ++ ) {
		for (int j = 0; j < n; j ++ ) {
			if (i >> j & 1) {
				for (int k = 0; k < n; k ++ ) {
					if (i - (1 << j) >> k & 1) {
						dp[i][j] = min(dp[i][j], dp[i - (1 << j)][k] + w[k][j]);
					}
				}
			}
		}
	}
	writen(dp[(1 << n) - 1][n - 1]);
}

题目五 : 起床困难综合症

思路 : 共有的一个性质 : 每次操作只会影响有关位上的数字 。

log2 (1e9) < 30 , 所以可以从 29 位开始依次判断能不能取 1

赋 a1 为 0 , a2 = -1 分别记录进行所有操作后的值 (a2 相当于 a1 所有位取反)

则 a1 位上为 1 的值 , 我们就可以在 res 上加上 1 , 或者 a2 位上为 1 的值, 我们也可以加上 1

运行11ms 512KB

ll n, m, res, d, a1, a2 = -1;
string op;
inline void solve() {
	n = read(); m = read();
	for (int i = 1; i <= n; i ++ ) {
		op = sread();
		d = read();
		if (op[1] == 'A') a1 &= d, a2 &= d;
		if (op[1] == 'O') a1 |= d, a2 |= d;
		if (op[1] == 'X') a1 ^= d, a2 ^= d;
	}
	for (int i = 1 << 29; i; i >>= 1) {
		if (a1 & i) res += i;
		else if (a2 & i && i <= m) res += i, m -= i;
	}
	writen(res);
}