Moamen and XOR

news/2024/12/2 19:42:19/

C. Moamen and XOR

莫阿门和伊扎特在玩游戏。他们创建了一个由n个非负整数组成的数组a其中每个元素都小于2k。
当a1&a2&a3&…&an≥a1⊕a2⊕a3⊕…其中&为按位与运算,⊕为按位异或运算。
请计算出Moamen数组a的中奖数量。
由于结果可能非常大,因此输出对1000000007取模的值(109+7)。

分析: 首先肯定要对 n n n 分奇偶,奇数个数字异或起来和偶数个数字异或起来情况肯定是不一样的,

n n n 为奇数
a 1 & a 2 & . . . a n a_1 \& a_2 \& ... a_n a1&a2&...an x x x, a 1 ⊕ a 2 ⊕ a 3 ⊕ … a n a_1⊕a_2⊕a_3⊕…a_n a1a2a3an y y y
x x x 最多有 k k k 位( 0 0 0 ~ k − 1 k-1 k1)
x x x的第 i i i 位为 1 1 1, y y y的第 i i i 位一定为 1 1 1(因为奇数个 1 1 1 异或一定为 1 1 1)
x x x的第 i i i 位为 0 0 0, y y y 的第 i i i 位为 0 0 0
因为 x x x 的第 i i i位为 0 0 0, 所以一定有 0 0 0, 然后因为 y y y 的第 i i i 位必须要为 0 0 0, 所以 只能有偶数个 1 1 1
C n 0 + C n 2 + C n 4 . . . . + C n n − 1 C^0_n + C^2_n + C^4_n.... + C^{n-1}_n Cn0+Cn2+Cn4....+Cnn1 = = = 2 n − 1 2^{n-1} 2n1
所以为 2 n − 1 + 1 2^{n-1} + 1 2n1+1, 这里为什么要 + 1 ? +1? +1?, 因为可能 x = 1 , y = 1 x = 1, y = 1 x=1,y=1 这种情况也要算上
然后求 2 n − 1 + 1 2^{n-1} + 1 2n1+1 k k k 次幂就可以了, 因为有 k k k 位嘛

n n n 为偶数

1.当 x x x的第 i i i 位为 1 1 1, y y y的第 i i i 位一定为 0 0 0(因为偶数个 1 1 1 异或一定为 0 0 0)
所以后面随便填就可以了
2.当 x x x的第 i i i 位为 0 0 0, y y y 的第 i i i 位为 0 0 0(一定要有偶数个 0 0 0,且不为 0 0 0, 因为 & \& & 出来是 0 0 0 )

对于情况 1 1 1, a n s + = 2 ( k − i ) n ans += 2^{{(k-i)}^n} ans+=2(ki)n
对于情况 2 2 2, a n s + = 2 n − 1 − 1 ans += 2^{n - 1} - 1 ans+=2n11

#include<bits/stdc++.h>
#define x first
#define int long long 
#define y second
#define gg exit(0);
#define io ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define db printf("debug\n");
const int N = 5e5 + 10, mod = 1e9 + 7;
using namespace std;
typedef pair<int,int>PII;
int T;
int n, k;int qmi(int a, int b)
{int res = 1;while(b){if(b&1) res = res * a % mod;a = a * a % mod;b >>= 1;}return res;
}
void solve()
{	cin >> n >> k;if(n % 2 != 0){int sum = (qmi(2, n - 1) + 1 + mod) % mod;cout << qmi(sum , k) << '\n';}else {int sum = qmi((qmi(2, n - 1) - 1 + mod )% mod, k);for(int i = k - 1; i >= 0; i -- )sum = (sum + qmi((qmi(2, n - 1) - 1 + mod )% mod, k - i - 1) * qmi(qmi(2, i), n)) % mod;cout << sum << '\n';}
}	
signed main()
{// io;// T = 1;cin >> T;while(T -- )solve();
}

http://www.ppmy.cn/news/262131.html

相关文章

umi.js

umi使用步骤 相关配置 在.umirc.ts文件中配置hash为true时&#xff0c;打包完dist目录下的js和css文件会生成随机hash值 配置base则会改变首页文件的访问路径,配置的时候还要一起配置一个publicPath&#xff0c;一般和base相同&#xff0c;添加这个的目的就是在dist生成的ind…

CubeMX的简介

在Cube工具还没出来之前&#xff0c;在ST的MCU开发都是用标准固件库&#xff0c;标准库自推出以来受到ST的使用者的推崇&#xff0c;现在很多公司也都在使用。但是ST官方在2013年后就没有更新版本&#xff0c;ST官方也全力推HAL&#xff08;Hardware Abstraction Layer&#xf…

Ymodem

目录 一、数据帧格式 1.1 起始帧 1.2 数据帧 1.3 结束帧 二、文件传输流程 2.1 传输符号表 三、CRC校验源码 一、数据帧格式 1.1 起始帧 格式1&#xff08;128byte&#xff09;&#xff1a;SOH 00 FF filename[ ] filezise[ ] NUL[ ] CRCH CRCL 格式2&#xff08;1k …

memmove

memmove void *memmove(void *dst, const void *src, size_t len);从src中复制len个字符到dst中&#xff0c;能保证复制的数据的准确性&#xff0c;不会影响dst中超出len的部分 #include <stdio.h> #include <ctype.h> #include <memory.h> #include <s…

tmux。。

Ctrlb 激活控制台&#xff1b;此时以下按键生效 面板操作 ”将当前面板平分为上下两块%将当前面板平分为左右两块x关闭当前面板!将当前面板置于新窗口&#xff1b;即新建一个窗口&#xff0c;其中仅包含当前面板Ctrl方向键以1个单元格为单位移动边缘以调整当前面板大小Alt方向…

UMI简介

关于UMI的一些东西&#xff0c;概念&#xff0c;位置&#xff0c;如何处理 UMI是什么 UMI全称&#xff1a;Unique Molecular Identifiers。 又称分子条形码技术&#xff0c;是对原始样本基因组打断后的每一个片段都加上一段特有的标签序列&#xff0c;用于区分同一样本中成千上…

cimoc 最新版_Cimoc官方版

Cimoc怎么更新&#xff1f;Cimoc官方最新版是一款非常不错的漫画阅读软件&#xff0c;Cimoc官方版里具有海量的优质小说资源&#xff0c;用户可一键搜索查询自己喜爱的漫画阅读&#xff0c;同时支持离线下载阅读&#xff0c;线上阅读等功能&#xff0c;让你随时免费阅读漫画&am…

为了不被裁之NVMe-MI oob

为了不被裁之NVMe-MI oob Nvme-MIoob(out-of-band)MI命令执行过程NVMe MI报文Message Header&#xff1a;Message Data&#xff1a;Message Integrity Check&#xff1a; NVMe MI报文分类1. Response Message格式2. Control Primitive格式3. NVMe MI Command格式4. NVMe Admin …