3 条题解
-
0
当 时,内部为 当且仅当 ,答案为 。
当 时:
- 且 时答案为 , 且 时答案为 ,这部分的答案为 。
- 时拿掉一个二进制位 可以使得答案为 ,所有 位二进制数中每位为 的频率均为 ,一共 个 ,去掉 的情况后有 个,考虑 互换后这部分的答案为 个。
- 上面两部分求和得到 。
#include <bits/stdc++.h> using namespace std; long long p[32]; const int P = 998244353; long long power(int x, long long y) { y %= P - 1; long long ans = 1; for (int i = 29; i >= 0; i--) if (y & (1 << i)) ans = ans * p[i] % P; return ans; } int main() { ios::sync_with_stdio(0); p[0] = 2; for (int i = 1; i <= 30; i++) p[i] = p[i - 1] * p[i - 1] % P; int T; cin >> T; while (T--) { long long n, k; cin >> n >> k; if (k == 0) cout << power(2, n) - 1 << '\n'; if (k == 1) cout << (n + 1) % P * (power(2, n) - 1) % P << '\n'; } return 0; } -
0
-
对于 的情况,只有当 时,表达式值为 ,否则为 ,所以和为 。
-
对于 的情况,通过分析二进制位的性质,推导出通项公式为 。
AC code:
#include <bits/stdc++.h> using namespace std; const int MOD = 998244353; #define ll long long ll qpow(ll a, ll b, ll mod) { ll res = 1; while (b) { if (b & 1) res = res * a % mod; a = a * a % mod, b >>= 1; } return res; } int main() { int T; cin >> T; while (T--) { ll n, k; cin >> n >> k; if (k == 0) { cout << (qpow(2, n, MOD) - 1 + MOD) % MOD << endl; } else { cout << ((((n % MOD) + 1) % MOD * qpow(2, n, MOD) % MOD) - (n % MOD) - 1 + MOD) % MOD << endl; } } return 0; } -
-
0
观察到 时答案为 , 时答案为 。使用快速幂即可,时间复杂度 。
进一步地,可以把指数对 取模后先做光速幂,时间复杂度 。
#include <bits/stdc++.h> using namespace std; long long p[32]; const int P = 998244353; long long power(int x, long long y) { y %= P - 1; long long ans = 1; for (int i = 29; i >= 0; i--) if (y & (1 << i)) ans = ans * p[i] % P; return ans; } int main() { ios::sync_with_stdio(0); p[0] = 2; for (int i = 1; i <= 30; i++) p[i] = p[i - 1] * p[i - 1] % P; int T; cin >> T; while (T--) { long long n, k; cin >> n >> k; if (k == 0) cout << power(2, n) - 1 << '\n'; if (k == 1) cout << (n + 1) % P * (power(2, n) - 1) % P << '\n'; } return 0; }
- 1
信息
- ID
- 247
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 4
- 标签
- 递交数
- 7
- 已通过
- 5
- 上传者