LINK:牛牛的数学题

题目看起来很不可做的样子。

但是 不难分析一下i,j之间的关系。

对于x=i|j且i&j==0, i,j一定是x的子集 我们可以暴力枚举子集来处理x这个数组。

考虑 x+k这个东西 对于一个y来说 x(0->y) k(0->y)容易发现这是一个NTT.

对于最外层^h 显然是FWT_xor 注意 FWT_xor 是 a0=a0+a1 a1=a0-a1.IFWT_xor a0=(a0+a1)>>1.a1=(a0-a1)>>1.

这点要熟记。

值得一提的是 题解在第一部中使用的是FMT不过我不会 所以暴力枚举子集了。

这里有一个trik 子集枚举是从大到小的 可以只枚举一半 这样可以优化一下复杂度。

3^17/2什么的 跑的还挺快。重要的一点:该取模的地方一定要取模 不然要调好久才能看出来。

const int MAXN=1<<17,G=3;
int n,lim,INV2,Q;
int mark[MAXN],rev[MAXN<<1];
int A[MAXN],B[MAXN],C[MAXN<<1],D[MAXN<<1],S[MAXN<<1];
inline void solve_AB()
{
S[0]=(ll)A[0]*B[0]%mod;
for(int i=1;i<lim;++i)
{
for(int j=i;j;j=i&(j-1))
{
if(mark[j]==i)break;
mark[j]=mark[i^j]=i;
S[i]=(S[i]+(ll)A[j]*B[i^j]+(ll)A[i^j]*B[j])%mod;
}
}
}
inline int ksm(int b,int p)
{
int cnt=1;
while(p)
{
if(p&1)cnt=(ll)cnt*b%mod;
b=(ll)b*b%mod;p=p>>1;
}
return cnt;
}
inline void NTT(int *a,int op)
{
rep(1,lim-1,i)if(i<rev[i])swap(a[i],a[rev[i]]);
for(int len=2;len<=lim;len=len<<1)
{
int mid=len>>1;
int wn=ksm(G,op==1?(mod-1)/len:mod-1-(mod-1)/len);
for(int j=0;j<lim;j+=len)
{
ll d=1;
for(int i=0;i<mid;++i)
{
int x=a[i+j],y=a[i+j+mid]*d%mod;
a[i+j]=(x+y)%mod;a[i+j+mid]=(x-y+mod)%mod;
d=d*wn%mod;
}
}
}
if(op==-1)
{
int INV=ksm(lim,mod-2);
rep(0,lim-1,i)a[i]=(ll)a[i]*INV%mod;
}
}
inline void solve_SC()
{
while(lim<=n+n)lim=lim<<1;
rep(1,lim-1,i)rev[i]=rev[i>>1]>>1|((i&1)?lim>>1:0);
NTT(S,1);NTT(C,1);
rep(0,lim-1,i)C[i]=(ll)C[i]*S[i]%mod;
NTT(C,-1);
}
inline void FWT_xor(int *a,int op)
{
for(int len=2;len<=lim;len=len<<1)
{
int mid=len>>1;
for(int j=0;j<lim;j+=len)
{
for(int i=0;i<mid;++i)
{
int x=a[i+j],y=a[i+j+mid];
if(op==1)a[i+j]=(x+y)%mod,a[i+j+mid]=(x-y+mod)%mod;
else a[i+j]=(ll)(x+y)*INV2%mod,a[i+j+mid]=(ll)(x-y+mod)*INV2%mod;
}
}
}
}
inline void solve_CD()
{
FWT_xor(C,1);FWT_xor(D,1);
rep(0,lim-1,i)D[i]=(ll)D[i]*C[i]%mod;
FWT_xor(D,-1);
}
int main()
{
freopen("1.in","r",stdin);
get(n);INV2=ksm(2,mod-2);
rep(0,n,i)get(A[i]);
rep(0,n,i)get(B[i]);
rep(0,n,i)get(C[i]);
rep(0,n,i)get(D[i]);
lim=1;while(lim<=n)lim=lim<<1;
solve_AB();
solve_SC();
solve_CD();
get(Q);
rep(1,Q,i)put(D[read()]);
return 0;
}

牛客挑战赛39 D 牛牛的数学题 NTT FMT FWT的更多相关文章

  1. 牛客挑战赛 39 牛牛与序列 隔板法 容斥 dp

    LINK:牛牛与序列 (牛客div1的E题怎么这么水... 还没D难. 定义一个序列合法 当且仅当存在一个位置i满足 $a_i>a_,a_j<a_$且对于所有的位置i,$1 \leq a_ ...

  2. 牛客练习赛39 B.选点

    链接:https://ac.nowcoder.com/acm/contest/368/B 来源:牛客网 题目描述 有一棵n个节点的二叉树,1为根节点,每个节点有一个值wi.现在要选出尽量多的点. 对于 ...

  3. 牛客练习赛39 B:选点(二叉树遍历+LIS)

    链接: https://ac.nowcoder.com/acm/contest/368/B 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262 ...

  4. 牛客挑战赛 30 A 小G数数

    题目链接:https://ac.nowcoder.com/acm/contest/375/A 分析:我写的时候竟然把它当成了DP....... 还建了个结构体DP数组,保存一二位,不知道当时脑子在抽啥 ...

  5. 良心送分题(牛客挑战赛35E+虚树+最短路)

    目录 题目链接 题意 思路 代码 题目链接 传送门 题意 给你一棵树,然后把这棵树复制\(k\)次,然后再添加\(m\)条边,然后给你起点和终点,问你起点到终点的最短路. 思路 由于将树复制\(k\) ...

  6. Luogu5611 Ynoi2013 D2T2/牛客挑战赛32F 最大子段和 分块、分治

    传送门 之前一直咕着的,因为一些特殊的原因把这道题更掉算了-- 有一个对值域莫队+线段树的做法,复杂度\(O(n\sqrt{n} \log n)\)然而牛客机子实在太慢了没有希望(Luogu上精细实现 ...

  7. 牛客练习赛63 C 牛牛的揠苗助长 主席树 二分 中位数

    LINK:牛牛的揠苗助长 题目很水 不过做法很多 想到一个近乎O(n)的做法 不过感觉假了 最后决定莽一个主席树 当然 平衡树也行. 容易想到 答案为ans天 那么一些点的有效增长项数为 ans%n. ...

  8. 牛客挑战赛30 小G砍树 树形dp

    小G砍树 dfs两次, dp出每个点作为最后一个点的方案数. #include<bits/stdc++.h> #define LL long long #define fi first # ...

  9. 牛客挑战赛30D 小A的昆特牌(组合数学)

    题面 传送门 题解 很容易写出一个暴力 \[\sum_{i=l}^r {i+n-1\choose n-1}{s-i+m\choose m}\] 即枚举选了多少个步兵,然后用插板法算出方案数 我们对这个 ...

随机推荐

  1. gulp之demo

    1.安装gulp cnpm install -g gulp; 2.然后还需要在当前目录安装gulp,具体不详,只知道安装了之后会在当前目录下的node_modules下多一个gulp文件夹 cnpm ...

  2. Freemarker 使用记录

    1.数字超过1000时会有逗号  ,设置数据格式 <#setting number_format="#"> 2.数据叠加 求总计: 1)定义变量:<#assign ...

  3. 三分钟了解 Python3 的异步 Web 框架 FastAPI

    快速编码,功能完善.从启动到部署,实例详解异步 py3 框架选择 FastAPI 的原因. FastAPI 介绍 FastAPI 与其它 Python-Web 框架的区别 在 FastAPI 之前,P ...

  4. python 爬虫写入txt:UnicodeEncodeError: ‘gbk’ codec can’t encode character 错误的解决办法

    原链接:https://blog.csdn.net/vito21/article/details/53490435 今天爬一个网站的内容,在写入TXT文件时,某些页面总是报UnicodeEncodeE ...

  5. Python之进程、线程、协程篇

    本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者 ...

  6. Python并发编程03 /僵孤进程,孤儿进程、进程互斥锁,进程队列、进程之间的通信

    Python并发编程03 /僵孤进程,孤儿进程.进程互斥锁,进程队列.进程之间的通信 目录 Python并发编程03 /僵孤进程,孤儿进程.进程互斥锁,进程队列.进程之间的通信 1. 僵尸进程/孤儿进 ...

  7. jpa随手笔记

    jpa注解1.设置Pojo为实体@Entity //标识这个pojo是一个jpa实体 2.设置表名@Table(name = "users") //指定表名为users 3.设置主 ...

  8. Vue JSX、自定义 v-model

    ​博客地址:https://ainyi.com/92 最初用到 JSX,就是做这个博客的时候.iview 表格组件,不支持像 element 那样直接写 html 代码渲染,只能通过 render 函 ...

  9. OSCP Learning Notes - WebApp Exploitation(2)

    Cross-Site Scripting(XSS) 1. Using the tool - netdiscover to find the IP of target server. netdiscov ...

  10. sqlserver安装出现找不到数据库引擎错误

    sqlserver安装出现找不到数据库引擎错误 问题的解决 第一次安装SQL server,发现它较于Oracle,都有安装卸载十分麻烦的特点.刚开始安装,就让我频繁遇到这个“找不到数据库引擎”的错误 ...