【bzoj4589】Hard Nim FWT
题目描述
输入
输出
每组数据输出一个数,表示答案
样例输入
3 7
4 13
样例输出
6
120
题解
FWT裸题
Nim游戏后手必胜条件:每堆石子数异或和为0。
那么设f[i]表示异或和为i的方案数,显然这是一个异或规则下的卷积(卷积求幂)
所以使用FWT,每个数转化后求对应的幂次,再求逆FWT即为答案。
#include <cstdio>
#include <cstring>
#define N 70000
typedef long long ll;
const ll mod = 1000000007 , inv = 500000004;
int np[N] , prime[N] , tot;
ll a[N];
ll pow(ll x , int y)
{
ll ans = 1;
while(y)
{
if(y & 1) ans = ans * x % mod;
x = x * x % mod , y >>= 1;
}
return ans;
}
void fwt(int len)
{
int i , j , k;
ll t;
for(i = 2 ; i <= len ; i <<= 1)
for(j = 0 ; j < len ; j += i)
for(k = j ; k < j + (i >> 1) ; k ++ )
t = a[k] , a[k] = (a[k] + a[k + (i >> 1)]) % mod , a[k + (i >> 1)] = (t - a[k + (i >> 1)] + mod) % mod;
}
void ufwt(int len)
{
int i , j , k;
ll t;
for(i = len ; i >= 2 ; i >>= 1)
for(j = 0 ; j < len ; j += i)
for(k = j ; k < j + (i >> 1) ; k ++ )
t = a[k] , a[k] = (a[k] + a[k + (i >> 1)]) * inv % mod , a[k + (i >> 1)] = (t - a[k + (i >> 1)] + mod) * inv % mod;
}
int main()
{
int n , m , i , j , len;
for(i = 2 ; i <= 50000 ; i ++ )
{
if(!np[i]) prime[++tot] = i;
for(j = 1 ; j <= tot && i * prime[j] <= 50000 ; j ++ )
{
np[i * prime[j]] = 1;
if(i % prime[j] == 0) break;
}
}
while(~scanf("%d%d" , &n , &m))
{
memset(a , 0 , sizeof(a));
for(i = 1 ; i <= tot && prime[i] <= m ; i ++ ) a[prime[i]] = 1;
for(len = 1 ; len <= m ; len <<= 1);
fwt(len);
for(i = 0 ; i < len ; i ++ ) a[i] = pow(a[i] , n);
ufwt(len);
printf("%lld\n" , a[0]);
}
return 0;
}
【bzoj4589】Hard Nim FWT的更多相关文章
- 【bzoj4589】Hard Nim FWT+快速幂
题目大意:给你$n$个不大于$m$的质数,求有多少种方案,使得这$n$个数的异或和为$0$.其中,$n≤10^9,m≤10^5$. 考虑正常地dp,我们用$f[i][j]$表示前$i$个数的异或和为$ ...
- 【BZOJ4589】Hard Nim(FWT)
题解: 由博弈论可以知道题目等价于求这$n$个数$\^$为0 快速幂$+fwt$ 这样是$nlog^2$的 并不能过 而且得注意$m$的数组$\^$一下会生成$2m$ #include <bit ...
- 【CF662A】Gambling Nim 线性基
[CF662A]Gambling Nim 题意:n长卡牌,第i张卡牌正面的数字是$a_i$,反面的数字是$b_i$,每张卡牌等概率为正面朝上或反面朝上.现在Alice和Bob要用每张卡牌朝上的数字玩N ...
- 【BZOJ3105】新Nim游戏(线性基)
[BZOJ3105]新Nim游戏(线性基) 题面 BZOJ Description 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以 ...
- 【CSU1911】Card Game(FWT)
[CSU1911]Card Game(FWT) 题面 vjudge 题目大意: 给定两个含有\(n\)个数的数组 每次询问一个数\(x\),回答在每个数组中各选一个数,或起来之后的结果恰好为\(x\) ...
- 【题解】毒蛇越狱(FWT+容斥)
[题解]毒蛇越狱(FWT+容斥) 问了一下大家咋做也没听懂,按兵不动没去看题解,虽然已经晓得复杂度了....最后感觉也不难 用FWT_OR和FWT_AND做一半分别求出超集和和子集和,然后 枚举问号是 ...
- 【CF772D】Varying Kibibits FWT
[CF772D]Varying Kibibits 题意:定义函数f(a,b,c...)表示将a,b,c..的10进制下的每一位拆开,分别取最小值组成的数.如f(123,321)=121,f(530, ...
- 【CF850E】Random Elections FWT
[CF850E]Random Elections 题意:有n位选民和3位预选者A,B,C,每个选民的投票方案可能是ABC,ACB,BAC...,即一个A,B,C的排列.现在进行三次比较,A-B,B-C ...
- 【SRM】518 Nim
题意 \(K(1 \le K \le 10^9)\)堆石子,每堆石子个数不超过\(L(2 \le 50000)\),问Nim游戏中先手必败局面的数量,答案对\(10^9+7\)取模. 分析 容易得到\ ...
随机推荐
- python_30_购物车复习
prodcut_list=[ ('Iphone', 5800), ('Mac Pro', 9800), ('Bike', 800), ('Watch', 10600), ('Coffee', 31), ...
- 外网访问FTP服务,解决只能以POST模式访问Filezilla的问题
在内网可以正常使用PASV,但是在外网不行,导致数据传输慢或者根本连接不了,在FlashFXP中通过日志,找到了解决方法解决方法1.在Filezilla——Edit——Settings——Passiv ...
- Oracle 函数 之 wm_concat()
wm_concat() 把列转换成一行一列显示,使用wm_concat函数可以显示在一行一列. --1 建表 create table province_city ( province varchar ...
- nginx.service: Failed to read PID from file /run/nginx.pid: Invalid argument解决
先附上错误信息: (myblog) root@Dapeng:/home/uwsgi# service nginx status ● nginx.service - A high performance ...
- JDBC的连接mySql的基本知识
这只是我自己的随笔博客~,用于偶尔回忆知识,可能存在一些错误,如有错误,欢迎指正~ 首先对于JDBC连接MySQL,要了解基本的框架结构 画的比较烂,大约就是这样的结构 然后看一下具体实现的 代码:: ...
- 详解三种java实现多线程的方式
java中实现多线程的方法有两种:继承Thread类和实现runnable接口. 1.继承Thread类,重写父类run()方法 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...
- 一、MySQL 安装
MySQL 安装 所有平台的 MySQL 下载地址为: MySQL 下载 . 挑选你需要的 MySQL Community Server 版本及对应的平台. 注意:安装过程我们需要通过开启管理员权限来 ...
- 整合mybatis和spring时 Error creating bean with name 'sqlSessionFactory' defined in class path resource
今天在整合mybatis和spring的时候出的错 报错如下 Exception in thread "main" org.springframework.beans.factor ...
- formpanel布局的学习
FormPanel有两种布局:form和column,form是纵向布局,column为横向布局.默认为后者.使用layout属性定义布局类型.对于一个复杂的布局表单,最重要的是正确分割,分割结果直接 ...
- js中如何把RGB颜色转换为16进制颜色
将RGB颜色值转换为16进制颜色值,主要是将 R.G.B 值分别转换为对应的十六进制值,填入 #RRGGBB 中. 推荐在线颜色转换工具:http://www.ecjson.com/rgbhex/ 例 ...