FWT [BZOJ 4589:Hard Nim]
4589: Hard Nim
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 275 Solved: 152
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
4 13
Sample Output
120
and:

or:

其实公式蛮好推的。。而且也不唯一 比如说 xor 还可以是 A=(A0-A1,A0+A1) 逆A就再反着算一下就可以
还有 FWT只是沿用 FFT和NTT的思想。
【FFT的思想,构造一种可逆的特殊变换trans,使得(trans(a*b))[i]=(trans(a))[i]*(trans(b))[i]。】
但是从界门纲目科属种来看 还是不像FFT与NTT 如此相似。
FWT不需要rev数组 ,举例N=8,下标为0~7。变换的时候,先对01,23,45,67做,再对02,13,46,57做,最后对04,15,26,37做。逆变换把顺序反过来就好了。
而且,这种特殊多项式乘法 满足结合律 ,trans后可以快速幂。
贴本题代码:
#include <bits/stdc++.h>
#define LL long long
const int mo=;
using namespace std;
int x,y,n,m,a[],T,t,f[];
LL po(LL x,LL y){
LL z=;
for (;y;y>>=,x=x*x%mo)
if (y&) z=z*x%mo;
return z;
}
void fwt(int *a,int n,int d){
for (m=;m<=n;m<<=)
for (int i=,k=m>>;i<n;i+=m)
for (int j=i;j<i+k;++j){
int u=a[j],v=a[j+k];
a[j]=(u+v)%mo,a[j+k]=(u-v)%mo;
}
if (d<){
LL x=po(n,mo-);
for (int i=;i<n;++i) a[i]=x*a[i]%mo;
}
}//注意a[i]<0
int main(){
for (int i=;i<=;++i){
if (!a[i]) a[++T]=i;
for (int j=;j<=T;++j){
int x=a[j]*i; if (x>) break;
a[x]=; if (!(i%a[j])) break;
}
}
while (scanf("%d%d",&x,&y)==){
for (t=;a[t]<=y;++t) f[a[t]]=; --t;
for (n=;n<=a[t];n<<=);
fwt(f,n,);
for (int i=;i<n;++i) f[i]=po(f[i],x);
fwt(f,n,-);
printf("%d\n",(f[]+mo)%mo);
for (int i=;i<n;++i) f[i]=;
}
return ;
}
化け物
FWT [BZOJ 4589:Hard Nim]的更多相关文章
- BZOJ 4589 Hard Nim(FWT+博弈论+快速幂)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4589 [题目大意] 有n堆石子,每堆都是m以内的质数,请问后手必胜的局面有几种 [题解 ...
- bzoj 4589 Hard Nim——FWT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4589 一开始异或和为0的话先手必败.有 n 堆,每堆可以填那些数,求最后异或和为0的方案数, ...
- BZOJ 4589 Hard Nim(FWT加速DP)
题目链接 Hard Nim 设$f[i][j]$表示前$i$个数结束后异或和为$j$的方案数 那么$f[i][j] = f[i-1][j$ $\hat{}$ $k]$,满足$k$为不大于$m$的质数 ...
- bzoj 4589 Hard Nim —— FWT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4589 先手必败,是一开始所有石子的异或和为0: 生成函数 (xpri[1] + xpri[2 ...
- bzoj 4589: Hard Nim【线性筛+FWT+快速幂】
T了两次之后我突然意识到转成fwt形式之后,直接快速幂每次乘一下最后再逆回来即可,并不需要没此次都正反转化一次-- 就是根据nim的性质,先手必输是所有堆个数异或和为0,也就变成了一个裸的板子 #in ...
- BZOJ.4589.Hard Nim(FWT)
题目链接 FWT 题意即,从所有小于\(m\)的质数中,选出\(n\)个数,使它们异或和为\(0\)的方案数. 令\(G(x)=[x是质数]\),其实就是对\(G(x)\)做\(n\)次异或卷积后得到 ...
- BZOJ 4589 Hard Nim ——FWT
[题目分析] 位运算下的卷积问题. FWT直接做. 但还是不太民白,发明者要承担泽任的. [代码] #include <cstdio> #include <cstring> # ...
- [BZOJ 4589]Hard Nim
Description 题库链接 两人玩 \(nim\) 游戏,\(n\) 堆石子,每堆石子初始数量是不超过 \(m\) 的质数,那么后手必胜的方案有多少种.对 \(10^9+7\) 取模. \(1\ ...
- bzoj 4589 FWT
#include<bits/stdc++.h> #define ll long long using namespace std; ; ; ; ; <<],b[<< ...
随机推荐
- 使用dd命令快速生成大文件或者小文件的方法
使用dd命令快速生成大文件或者小文件的方法 转载请说明出处:http://blog.csdn.net/cywosp/article/details/9674757 在程序的测试中有些场 ...
- 洛谷 P 1018 乘积最大 ==Codevs
题目描述 今年是国际数学联盟确定的“2000――世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得 ...
- Java开发一些小的思想与功能小记(二)
1.用if+return代替复杂的if...else(if+return) public static void test1(String str) { if ("1".equal ...
- oc温习七:结构体与枚举
结构体和枚举都是一种存储复杂的数据.结构体是用户自定义的一种类型,不同类型的集合. 1.结构体的创建及使用 定义结构体类型 struct MyDate { int year; int month; i ...
- 钱币兑换问题---hdu1284(完全背包)
Problem Description 在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法.请你编程序计算出共有多少种兑法. Input 每行只有一个正整数N,N小于32768. ...
- java代码 猜数字小游戏
import java.util.Scanner; import java.util.Random; public class mulTip{ public static void main(Stri ...
- Unity从实践中学习(1)
首先在实际中unity的开发之中快捷键应该是相当重要的一个部分,这里先引用csdn的一个博客,https://blog.csdn.net/qq_34552886/article/details/697 ...
- 转 常见hash算法的原理
散列表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法.顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙. 散列表(Hash table,也叫 ...
- Go和HTTPS(TLS)
原文链接: http://studygolang.com/wr?u=http%3a%2f%2ftonybai.com%2f2015%2f04%2f30%2fgo-and-https%2f 近期在构思一 ...
- "undefined reference to strptime"之自己定义strptime函数
简单介绍 strptime()函数可以依照特定时间格式将字符串转换为时间类型.简单点说可以将字符串时间转化为时间戳. 这个函数包括在time.h头文件里,在Unix或者类Unix系统中,我们会常常 ...