hdu6129 Just Do It!
2024-10-19 07:35:10
多校时找规律做过。。。
题意,给你一个数列a[1], a[2], a[3], a[4], ... , a[n],操作一次后变为a[1], a[1] ^ a[2], a[1] ^ a[2] ^ a[3], ..., a[1] ^ a[2] ^ a[3] ^...^a[n],
让你计算出m次操作后的数列
令F(x, y, i) 表示x次操作后新的a[y]中初始 a[i]被亦或的次数
F(x, y, i) = F(x - 1, y, i) + F(x, y - 1, i)
联系几何意义,实际就是(1, i) 到 (x, y) 的路径条数,即 C(m - 1 + x - i, x - i)。
即可得到n^2的做法,猜想这些组合数中偶数很多,调整循环顺序,就AC了
这里判断组合数是否为偶数,采用了比较2的方幂的方法。
当然,也可以使用库摩尔定理(大概是15年联赛数论23333)
库摩尔定理:有两个正整数n,m,p是质数,C(n + m, m) 含p的幂次等于m+n在p进制下的进位数。
(在p进制下,产生一次进位,会贡献一个p)
当p为2时,若C(n + m, m)为奇数,则m+n不能产生进位,则意味着m数位为1的地方n必须为0,n数位为1的地方m必须为0,即 m & n = 0
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int N = 2e5 + ;
int a[N], b[N];
#define rep(i, j, k) for (int i = int(j); i <= int(k); ++ i) inline int f(int x) {
int ret = ;
while (x) {
ret += (x >> );
x >>= ;
}
return ret;
}
inline int Comb(int n, int m) {
return f(n) - f(m) - f(n - m);
}
int main() {
int T;
scanf("%d", &T);
while (T--) {
int n, m;
scanf("%d%d", &n, &m);
rep(i, , n) scanf("%d", a + i);
// rep(x, 1, n) {
// rep(i, 1, x) {
// if (!Comb(m - 1 + x - i, x - i)) b[x] ^= a[i];
// }
// }
rep(j, , n - )
if (!Comb(m - + j, j)) {
rep(x, j + , n) {
int i = x - j;
b[x] ^= a[i];
}
} rep(i, , n - ) printf("%d ", b[i]);
printf("%d\n", b[n]);
memset(b, , sizeof(b));
}
}
最新文章
- Linux下的串口编程及非阻塞模式
- 比特币_Bitcoin 简介
- Cheat sheets
- c# 验证码类
- C#:数据交互
- List-ApI及详解
- 安卓手机的touchend事件不触发问题
- STM32软件仿真的一个注意点
- Windows 内核(WRK)编译
- for的用法
- tomcat 7 启动超时设置。。。实在太隐蔽了
- python基础(二)- 字符串
- stock 当天盘势
- ios获取本机网络IP地址方法
- TypeScript 函数-Lambads 和 this 关键字的使用
- 获取访问IP
- Evenbus简单用法
- Mongodb的windows服务安装和卸载
- Python | 一行命令生成动态二维码
- Java 8新增的Lambda表达式
热门文章
- Java之事务的基本应用
- nginx配置虚拟主机vhost的方法详解
- Number 强制类型转换 int 强制转换整型 float 强制转换浮点型 complex 强制转换成复数 bool 强制转换成布尔类型,结果只有两种,要么True 要么 False ";";";bool 可以转换所有的数据类型 everything";";";
- pprint
- php判断是否为命令行模式
- Linux平台 Oracle 18c RAC安装Part2:GI配置
- 四、latex字体字号设置
- 从Win32程序中的主函数中获取命令行参数
- js前端使用jOrgChart插件实现组织架构图的展示
- 第二篇——Struts2的Action搜索顺序