2021-09-08 11:16阅读: 58评论: 0推荐: 1

CF 1557 C. Moamen and XOR

C. Moamen and XOR

题目大意

给定n,k,要求创建一个n个数的数组a,满足0ai<2k,且a1&a2&a3&&ana1a2a3an,问方案数。

解题思路

简单DP

从高位考虑,设dp[i]表示前i位满足条件的方案数,根据n的奇偶性,考虑与结果i位为01时的转移即可。

  • n为奇数
    • 与结果第i位为1,则异或结果也为1,此时dp[i]+=dp[i1]
    • 与结果第i位为0,则要使异或结果也为0,第i位填法有Cn0+Cn2+Cn4+...+Cnn1=2n1,此时dp[i]+=2n1dp[i1]
    • dp[i]=dp[i1]+2n1dp[i1]
  • n为偶数
    • 与结果第i位为1,则异或结果为0,剩下i1位随便填,此时dp[i]+=2(i1)n
    • 与结果第i位为0,则要使异或结果也为0,第i位填法有Cn0+Cn2+Cn4+...+Cnn2=2n11,此时dp[i]+=(2n11)×dp[i1](除去Cnn即全为1的填法,因为此时与结果为1)
    • dp[i]=2(i1)n+(2n11)×dp[i1]
神奇的代码
#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 中国大陆许可协议进行许可。

posted @   ~Lanly~  阅读(58)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.