CF 1557 C. Moamen and XOR
C. Moamen and XOR
题目大意
给定,要求创建一个个数的数组,满足,且,问方案数。
解题思路
简单。
从高位考虑,设表示前位满足条件的方案数,根据的奇偶性,考虑与结果第位为和时的转移即可。
- 为奇数
- 与结果第位为,则异或结果也为,此时
- 与结果第位为,则要使异或结果也为,第位填法有,此时
- 即
- 为偶数
- 与结果第位为,则异或结果为,剩下位随便填,此时
- 与结果第位为,则要使异或结果也为,第位填法有,此时(除去即全为1的填法,因为此时与结果为1)
- 即
神奇的代码
#include <bits/stdc++.h> using namespace std; typedef long long LL; template <typename T> void read(T &x) { int s = 0, c = getchar(); x = 0; while (isspace(c)) c = getchar(); if (c == 45) s = 1, c = getchar(); while (isdigit(c)) x = (x << 3) + (x << 1) + (c ^ 48), c = getchar(); if (s) x = -x; } template <typename T, typename... rest> void read(T &x, rest&... Rest) { read(x); read(Rest...); } template <typename T> void write(T x, char c = ' ') { int b[40], l = 0; if (x < 0) putchar(45), x = -x; while (x > 0) b[l++] = x % 10, x /= 10; if (!l) putchar(48); while (l) putchar(b[--l] | 48); putchar(c); } const LL mo = 1e9 + 7; const int N = 2e5 + 8; int n, k; LL dp[N], p2[N]; LL qpower(LL a, LL b){ LL qwq = 1; while(b){ if (b & 1) qwq = qwq * a % mo; a = a * a % mo; b >>= 1; } return qwq; } int main(void) { int kase; read(kase); p2[0] = 1; for(int i = 1; i < N; ++ i) p2[i] = p2[i - 1] * 2 % mo; for (int ii = 1; ii <= kase; ii++) { read(n, k); memset(dp, 0, sizeof(dp)); dp[0] = 1; for(int i = 1; i <= k; ++ i) if (n & 1){ dp[i] = (dp[i - 1] + p2[n - 1] * dp[i - 1] % mo) % mo; }else{ dp[i] = (qpower(p2[i - 1], n) + (p2[n - 1] - 1) * dp[i - 1] % mo) % mo; } write(dp[k], '\n'); } return 0; }
本文作者:~Lanly~
本文链接:https://www.cnblogs.com/Lanly/p/15241905.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步