CF #737 C. Moamen and XOR
C. Moamen and XOR
题目链接
题目大意:每组样例给一个 nnn 和 kkk ,问有多少个长度为 nnn 的序列 aaa ,其所有 aia_iai 小于 2k2^k2k ,且 a1&a2&a3...&an≥a1⊕a2⊕a3...⊕ana_1\&a_2\&a_3...\&a_n≥a_1⊕a_2⊕a_3...⊕a_na1&a2&a3...&an≥a1⊕a2⊕a3...⊕an
首先考虑等于的情况,那么等于就是所有位都等于,那么我们考虑某一位相等的情况,对于这一位而言,我们要相等,又是两种情况,为 000 相等或为 111 相等。如果为 000 相等,那么首先就是异或值要为 000 ,则 nnn 个数字的这一位上的要有偶数个 111 ,则有 Cn0+Cn2+Cn4+...+Cn小于n的最大偶数=2n−1C_n^0+C_n^2+C_n^4+...+C_n^{小于n的最大偶数}=2^{n-1}Cn0+Cn2+Cn4+...+Cn小于n的最大偶数=2n−1 。那么我们发现这里可能有种情况需要减掉,就是 nnn 是偶数的话 CnnC_n^nCnn 的情况,不是等于,而是大于,所以这种情况算出来之后要减一。然后考虑为 111 相等的情况,那么只有全 111 才可能相与为 111 ,但是异或那边要为 111 之后奇数个 111 才行,所以这种情况只能 nnn 为奇数才能加一。我们可以最终算得某一位相等的情况为 ccc ,所有位都相等即为 ckc^kck
然后考虑大于,大于就是枚举在哪一位大于,大于只能是相与为 111 ,异或为 000 ,所以只有 nnn 为偶数才可能发生。然后枚举在第 iii 位发生了大于,这一位肯定只有一种情况,就是全 111 了。那么前 i−1i-1i−1 位就要全相等,也就是有 ci−1c^{i-1}ci−1 种情况,后面随便放什么都可以,那么后面一共有 (k−i)∗n(k - i) * n(k−i)∗n 个二进制位,每个都随便放什么,所以后面的情况就是 2(k−i)∗n2^{(k - i) * n}2(k−i)∗n ,所以在第 iii 位发生大于的情况数为: ci−1∗2(k−i)∗nc^{i-1}*2^{(k - i) * n}ci−1∗2(k−i)∗n ,所以大于的情况总数也就是: ∑i=1k(ci−1∗2(k−i)∗n)\sum\limits_{i=1}^k(c^{i-1}*2^{(k - i) * n})i=1∑k(ci−1∗2(k−i)∗n)
将上述两种情况相加即可得答案。
#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 2e5 + 10;const ll mod = 1e9 + 7;ll n, k;ll ksm(ll base, ll n) {ll ans = 1;while(n) {if (n & 1ll) ans = ans * base % mod;base = base * base % mod;n >>= 1ll;}return ans;
}int main() {#ifndef ONLINE_JUDGEfreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);
#endifint T;scanf("%d", &T);while(T--) {ll ans = 0;scanf("%lld%lld", &n, &k);ll c = ksm(2ll, n - 1);if (n % 2 == 0) {c = (c - 1 + mod) % mod;}if (n & 1) {c = (c + 1) % mod;}ans = (ans + ksm(c, k)) % mod;if (n % 2 == 0) {for (int i = 1; i <= k; ++i) { // 大于的情况ll tmp1 = ksm(c, i - 1);ll tmp2 = ksm(2ll, (k - i) * n);ans = (ans + tmp1 * tmp2 % mod) % mod;}}printf("%lld\n", ans);}
}
CF #737 C. Moamen and XOR相关推荐
- Codeforces Round #737 (Div. 2)---C. Moamen and XOR
Codeforces Round #737 (Div. 2)-C. Moamen and XOR Moamen and Ezzat are playing a game. They create an ...
- cf1557 C. Moamen and XOR
cf1557 C. Moamen and XOR 题意: 一个n位数,每一位小于2k2^k2k,如果a1&a2&-an>=a1⊕a2-⊕an,则获胜 现在给你n和k,问能构造多少 ...
- cf 737 div2
题目 C题,推公式.dp. 题意: 给定长度为n的数组,每个数的取值为0 - 2^k中任取.求数量: 整个数组的& >= 整个数组的异或.(即 a1 & a2 - & a ...
- Moamen and XOR
C. Moamen and XOR 莫阿门和伊扎特在玩游戏.他们创建了一个由n个非负整数组成的数组a其中每个元素都小于2k. 当a1&a2&a3&-&an≥a1⊕a2⊕ ...
- CF1557C Moamen and XOR
C. Moamen and XOR Moamen and Ezzat are playing a game. They create an array a of n non-negative inte ...
- CF #737(div2)C. Moamen and XOR 与和异或-找规律
题意 : 给 n 和 k (<2e5),保证每个数ai < 2^k,问使得
- CF #737(div2)B. Moamen and k-subarrays 贪心
题意 : 给一个长为 n 的序列(distinct),将其分为 <= k 个连续的序列,对这些段任意组合,求能否得到递增序列. 思路 : 记录在原序列中每个distinct的位置,然后在结果序列 ...
- CF #737 (Div. 2) B. Moamen and k-subarrays
题目: 点这里 碎碎念: 气死我了气死我了,这题预判过了结果重判wa了,本来没准备写题解的.最后一小时看C没做出来的我像个小丑 要求: 看看能不能将长度为n的数组分成k块排序后符合从小到大. 分析: ...
- 组合计数 ---- Codeforces 737C Div2 C. Moamen and XOR [多阶段决策计数dp]
题目链接 题目大意: 有nnn个数.每次数范围是[0,2k]∣k∈[0,3e5][0,2^k]|k\in[0,3e5][0,2k]∣k∈[0,3e5] 问你有多少种情况这nnn个数的与大于等于异或 首 ...
最新文章
- 原根与指标,离散对数
- find -exec 与xargs 区别
- OpenCV各向异性图像分割anisotropic image segmentation的实例(附完整代码)
- centos7 tomcat_centos7中利用logrotate工具切割日志,以tomcat日志为例
- Apollo创建项目
- linux之安装mysql提示Error: Unable to find a match: mysql-community-server
- 【前端就业课 第一阶段】HTML5 零基础到实战(九)列表
- 【面试必备】java写spark好不好
- 红橙Darren视频笔记 view的invalidate调用draw方法的流程(源码分析基于api 29)
- Python学习相关资料
- 9年120亿,美的数字化转型纪实
- Java中的switch分支语句
- 项目实现思路(不断更新)
- 圆弧周长公式_弧长计算公式的公式
- win10主题更换_小白如何做到不更换硬件提升电脑性能做到不卡顿?
- php生成订单 调微信支付,PHP后台微信支付使用方法
- 小程序源码:2022虎年全新头像框制作
- 2.1 內积与欧几里得空间
- jsPlumb使用小技巧
- 零基础如何入门网络安全?2022年专业学习路线看这篇就够了