求用n个3的倍数的数按位或出数字a的方案数有多少种(0也算3的倍数)

题解

  • 若数b的每个二进制位上的1,在a中也为1,则称b为a的子集
  • 容易知道任意个a的子集按位或出来的结果还是a的子集
  • 若问题改为按位或出来的结果是a的子集的方案数,那么答案就是a的子集中是3的倍数的子集个数的n次方

    接着我们对子集按二进制上的1 mod 3的个数划分,例如1101有两个1mod3=1, 一个1mod3 = 2,设\(S[i][j]\)表示a的子集中有i个mod3=1,j个mod3=2的子集的子集 中是3的倍数的个数,例如a = 1101的一个子集1001表示的状态为\(S[1][1]\), 1001的子集中是3的倍数的有1001和0000所以\(S[1][1] = 2\),那么\(S[i][j]\)的n次方就可以表示为用n个3的倍数的数按位或出来的结果的状态是S[i][j]的子集方案数

    那么\(\sum_{i=1}^kS[i][k-i]\)就表示或出来的结果最多匹配上a中K个1的方案数,那么我们就可以用最多匹配上a中K个1的方案数,减去匹配上a中K-1个1的方案数得出答案,但是这样简单的相减是不行的因为\(S[i][k-i]\)的子集是会有重叠的,会多扣掉最多匹配k-2个1的方案数,根据容斥原理应当减去最多匹配K-1的方案数,加上最多匹配K-2的方案数,扣掉K-3加上K-4...

代码

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int mx = 65;
const ll mod = 998244353;
int C[mx][mx], S[mx][mx]; ll pow_mod(ll a, ll b) {
ll ans = 1;
while (b > 0) {
if (b & 1) ans = ans * a % mod;
a = a * a % mod;
b /= 2;
}
return ans;
} int main() {
C[0][0] = 1;
for (int i = 1; i < mx; i++) {
C[i][0] = 1;
for (int j = 1; j <= i; j++) {
C[i][j] = (C[i-1][j-1] + C[i-1][j]) % mod;
}
} for (int i = 0; i < mx; i++) {
for (int j = 0; j < mx; j++) {
for (int p = 0; p <= i; p++) {
for (int q = 0; q <= j; q++) {
if ((p + 2*q) % 3 != 0) continue;
S[i][j] += C[i][p] * C[j][q] % mod;
S[i][j] %= mod;
}
}
}
}
S[0][0] = 1; int T;
scanf("%d", &T); while (T--) {
ll n, a, x = 0, y = 0;
scanf("%lld%lld", &n, &a);
for (int i = 0; i < 64; i++) {
if (a & (1LL<<i)) {
if (i % 2 == 0) x++;
else y++;
}
}
ll ans = 0;
for (int i = 0; i <= x; i++) {
for (int j = 0; j <= y; j++) {
ll tmp = C[x][i] * C[y][j] % mod * pow_mod(S[i][j], n) % mod;
if ((x+y-i-j) % 2) tmp *= -1;
ans = (ans + tmp) % mod;
}
}
ans = (ans + mod) % mod;
printf("%lld\n", ans);
}
return 0;
}

E-triples II_2019牛客暑期多校训练营(第四场)的更多相关文章

  1. 2019牛客暑期多校训练营(第九场)A:Power of Fibonacci(斐波拉契幂次和)

    题意:求Σfi^m%p. zoj上p是1e9+7,牛客是1e9:  对于这两个,分别有不同的做法. 前者利用公式,公式里面有sqrt(5),我们只需要二次剩余求即可.     后者mod=1e9,5才 ...

  2. 2019牛客暑期多校训练营(第一场)A题【单调栈】(补题)

    链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 题目描述 Two arrays u and v each with m distinct elem ...

  3. 2019牛客暑期多校训练营(第一场) B Integration (数学)

    链接:https://ac.nowcoder.com/acm/contest/881/B 来源:牛客网 Integration 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 5242 ...

  4. 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...

  5. 2019牛客暑期多校训练营(第二场)F.Partition problem

    链接:https://ac.nowcoder.com/acm/contest/882/F来源:牛客网 Given 2N people, you need to assign each of them ...

  6. 2019牛客暑期多校训练营(第一场)A Equivalent Prefixes(单调栈/二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 Two arrays u and v each with m distinct elements ...

  7. [状态压缩,折半搜索] 2019牛客暑期多校训练营(第九场)Knapsack Cryptosystem

    链接:https://ac.nowcoder.com/acm/contest/889/D来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言52428 ...

  8. 2019牛客暑期多校训练营(第二场)J-Subarray(思维)

    >传送门< 前言 这题我前前后后看了三遍,每次都是把网上相关的博客和通过代码认真看了再思考,然并卵,最后终于第三遍也就是现在终于看懂了,其实懂了之后发现其实没有那么难,但是的的确确需要思维 ...

  9. J-Subarray_2019牛客暑期多校训练营(第二场)

    题意 有一个只由1,-1组成的数组,给出所有连续的1所在位置,求满足1的个数大于-1的个数的子区间的数量 题解 参考博客:https://www.cnblogs.com/Yinku/p/1122149 ...

随机推荐

  1. 洛谷P1003 题解

    题面 思路一:纯模拟.(暴力不是满分) 思路: 1.定义一个二维数组. 2.根据每个数据给二维数组赋值. 3.最后输出那个坐标的值. 思路二(正规思路): 逆序找,因为后来的地毯会覆盖之前的,一发现有 ...

  2. 整理github总结

    之前记述过两篇关于git命令的随笔,那时候对git的理解还不太深(虽然现在理解的也不是很多...菜哭了),只会用那些命令,并没有形成自己的知识,今天下载完Git之后,规整了一下自己的github,在吃 ...

  3. 【有容云】PPT | 容器落地之二三事儿

    编者注: 本文为10月29日有容云联合创始人兼研发副总裁江松在 Docker Live时代线下系列-广州站中演讲的PPT,本次线下沙龙为有容云倾力打造Docker Live时代系列主题线下沙龙,每月一 ...

  4. 从原理层面掌握@SessionAttribute的使用【一起学Spring MVC】

    每篇一句 不是你当上了火影大家就认可你,而是大家都认可你才能当上火影 前言 该注解顾名思义,作用是将Model中的属性同步到session会话当中,方便在下一次请求中使用(比如重定向场景~). 虽然说 ...

  5. 使用Junit测试一个 spring静态工厂实例化bean 的例子,所有代码都没有问题,但是出现java.lang.IllegalArgumentException异常

    使用Junit测试一个spring静态工厂实例化bean的例子,所有代码都没有问题,但是出现 java.lang.IllegalArgumentException 异常, 如下图所示: 开始以为是代码 ...

  6. MySQL操作命令梳理(2)

    一.表操作 在mysql运维操作中会经常使用到alter这个修改表的命令,alter tables允许修改一个现有表的结构,比如增加或删除列.创造或消去索引.改变现有列的类型.或重新命名列或表本身,也 ...

  7. ccf 201809-4 再卖菜

    这题一开始不知道剪枝这种操作,只会傻傻地dfs. 然后dfs递归写80分超时,非递归写70分超时(纳尼?我一直以为非递归算法在时间上会更优秀一些,为什么会这样?!!) 剪一下枝就都能过了 #inclu ...

  8. jquery验证大全

    jQuery验证及限制 绑定键盘监听事件 $(document).on("keypress", ".txt-valid-len", function (e) { ...

  9. AOSP 预置 APP

    Android 系统预置 APP 是做 Framework 应用开发经常经常会遇到的工作,预置 APP 分为两种,一种是直接预置 APK,一种是预置带有源码的 APP. 预置 apk 示例说明 以 . ...

  10. 怎么把PicPick设置成中文版?

    1.首先打开软件 2.在File文件中中点击能看到Program Options这一选项,单击打开 3.右下方有个Language选项,改成简体中文