题目连接:

http://acm.hdu.edu.cn/showproblem.php?pid=6589

题解连接:

https://www.cnblogs.com/xusirui/p/11229450.html

https://www.cnblogs.com/FST-stay-night/p/11227505.html

NTT来自:

https://www.cnblogs.com/Sakits/p/8416918.html

题解1说,要先暴力模拟看看规律。

一个很明显的直觉是可以看看最终的序列由哪些a[i]贡献而成。但是我连暴力都不会写啊。

还不如手推:

当x为1时:

观察求前缀和的过程

0次: a[0], a[1], a[2], a[3]

1次: a[0], a[1]+a[0], a[2]+a[1]+a[0], a[3]+a[2]+a[1]+a[0]

2次: a[0], a[1]+2a[0], a[2]+2a[1]+3a[0], a[3]+2a[2]+3a[1]+4a[0]

3次: a[0], a[1]+3a[0], a[2]+3a[1]+6a[0], a[3]+3a[2]+6a[1]+10a[0]

4次: a[0], a[1]+4a[0], a[2]+4a[1]+10a[0], a[3]+4a[2]+10a[1]+20a[0]

每一项前面的系数看起来有什么规律?

0次的时候就跳过吧……

1次的时候,各个都是1?其实是 C(i,0) 。

2次的时候,是从1开始递增的。其实是 C(i+1,1) 。

3次的时候,第i项的系数看起来像 C(i+2,2) 。

4次的时候,第i项的系数看起来像 C(i+3,3) 。

所以第m次时候,系数应该是c[i]=C(m-1+i,m-1)。

m次: c[0]a[0], c[0]a[1]+c[1]a[0], c[0]a[2]+c[1]a[1]+c[2]a[0], c[0]a[3]+c[1]a[2]+c[2]a[1]+c[3]a[0]

那么其实就是数组:

a[0],a[1],a[2],a[3],a[4]...

c[0],c[1],c[2],c[3],c[4]...

做卷积的结果。

所以就预处理组合数一波,然后直接NTT。

然后其实x=2和x=3是对几个数组分开求这个前缀和。

标程给出一个更方便的做法。直接跳着赋值,例如在x=2的时候,赋值c'[0]=c[0],c'[1]=0,c'[2]=c[1],c'[3]=0,c'[4]=c[2],c'[5]=0

那么直接卷积就是:

m次: c[0]a[0], c[0]a[1], c[0]a[2]+c[1]a[0], c[0]a[3]+c[1]a[1], c[0]a[4]+c[1]a[2]+c[2]a[0]

从标程瞎改的快一倍的AC代码。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll; const int MAXN = 2e6, mod = 998244353; inline int pow_mod(ll x, int n) {
ll res;
for(res = 1; n; n >>= 1, x = x * x % mod)
if(n & 1)
res = res * x % mod;
return res;
} inline int add_mod(int x, int y) {
x += y;
return x >= mod ? x - mod : x;
} inline int sub_mod(int x, int y) {
x -= y;
return x < 0 ? x + mod : x;
} void NTT(int a[], int n, int op) {
for(int i = 1, j = n >> 1; i < n - 1; ++i) {
if(i < j)
swap(a[i], a[j]);
int k = n >> 1;
while(k <= j) {
j -= k;
k >>= 1;
}
j += k;
}
for(int len = 2; len <= n; len <<= 1) {
int g = pow_mod(3, (mod - 1) / len);
for(int i = 0; i < n; i += len) {
int w = 1;
for(int j = i; j < i + (len >> 1); ++j) {
int u = a[j], t = 1ll * a[j + (len >> 1)] * w % mod;
a[j] = add_mod(u, t), a[j + (len >> 1)] = sub_mod(u, t);
w = 1ll * w * g % mod;
}
}
}
if(op == -1) {
reverse(a + 1, a + n);
int inv = pow_mod(n, mod - 2);
for(int i = 0; i < n; ++i)
a[i] = 1ll * a[i] * inv % mod;
}
} int A[MAXN + 5], B[MAXN + 5];
int Asize, Bsize; int pow2(int x) {
int res = 1;
while(res < x)
res <<= 1;
return res;
} void convolution(int A[], int B[], int Asize, int Bsize) {
int n = pow2(Asize + Bsize - 1);
for(int i = Asize; i < n; ++i)
A[i] = 0;
for(int i = Bsize; i < n; ++i)
B[i] = 0;
NTT(A, n, 1);
NTT(B, n, 1);
for(int i = 0; i < n; ++i)
A[i] = 1ll * A[i] * B[i] % mod;
NTT(A, n, -1);
return;
} const int MAXM = 2e6; int fact[MAXM + 5], ifact[MAXM + 5]; int C(int n, int m) {
return m <= n ? (ll)fact[n] * ifact[m] % mod * ifact[n - m] % mod : 0;
} void init_C() {
fact[0] = 1;
for(int i = 1; i <= MAXM; ++i)
fact[i] = 1ll * fact[i - 1] * i % mod;
ifact[MAXM] = pow_mod(fact[MAXM], mod - 2);
for(int i = MAXM - 1; i >= 0; --i)
ifact[i] = 1ll * ifact[i + 1] * (i + 1) % mod;
} int main() {
#ifdef Yinku
freopen("Yinku.in", "r", stdin);
#endif // Yinku
init_C();
int T;
scanf("%d", &T);
while(T--) {
int n, m;
scanf("%d%d", &n, &m);
for(int i = 0; i < n; ++i) {
scanf("%d", &A[i]);
}
int cnt[] = {0, 0, 0, 0};
for(int i = 1; i <= m; ++i) {
int x;
scanf("%d", &x);
cnt[x]++;
}
for(int c = 1; c <= 3; ++c) {
if(cnt[c]) {
memset(B, 0, sizeof(B[0])*n);
for(int i = 0; i * c < n; ++i) {
B[i * c] = C(cnt[c] - 1 + i, i);
}
convolution(A, B, n, n);
}
}
ll ans = 0;
for(int i = 0; i < n; ++i)
ans ^= 1ll * (i + 1) * A[i];
printf("%lld\n", ans);
}
return 0;
}

2019 Multi-University Training Contest 1 - 1012 - NTT的更多相关文章

  1. 2016 Multi-University Training Contest 5 1012 World is Exploding 树状数组+离线化

    http://acm.hdu.edu.cn/showproblem.php?pid=5792 1012 World is Exploding 题意:选四个数,满足a<b and A[a]< ...

  2. HDU 5775 Bubble Sort(线段树)(2016 Multi-University Training Contest 4 1012)

    原址地址:http://ibupu.link/?id=31 Problem Description P is a permutation of the integers from 1 to N(ind ...

  3. HDU 6373.Pinball -简单的计算几何+物理受力分析 (2018 Multi-University Training Contest 6 1012)

    6373.Pinball 物理受力分析题目. 画的有点丑,通过受力分析,先求出θ角,为arctan(b/a),就是atan(b/a),然后将重力加速度分解为垂直斜面的和平行斜面的,垂直斜面的记为a1, ...

  4. HDU 6343.Problem L. Graph Theory Homework-数学 (2018 Multi-University Training Contest 4 1012)

    6343.Problem L. Graph Theory Homework 官方题解: 一篇写的很好的博客: HDU 6343 - Problem L. Graph Theory Homework - ...

  5. HDU 6330.Problem L. Visual Cube-模拟到上天-输出立方体 (2018 Multi-University Training Contest 3 1012)

    6330.Problem L. Visual Cube 这个题就是输出立方体.当时写完怎么都不过,后来输出b<c的情况,发现这里写挫了,判断失误.加了点东西就过了,mdzz... 代码: //1 ...

  6. 2019 Nowcoder Multi-University Training Contest 4 E Explorer

    线段树分治. 把size看成时间,相当于时间 $l$ 加入这条边,时间 $r+1$ 删除这条边. 注意把左右端点的关系. #include <bits/stdc++.h> ; int X[ ...

  7. 2019 Nowcoder Multi-University Training Contest 1 H-XOR

    由于每个元素贡献是线性的,那么等价于求每个元素出现在多少个异或和为$0$的子集内.因为是任意元素可以去异或,那么自然想到线性基.先对整个集合A求一遍线性基,设为$R$,假设$R$中元素个数为$r$,那 ...

  8. HDU 6762 Mow (2020 Multi-University Training Contest 1 1012) 半平面交

    Mow 题目链接 分析 将多边形的边向内部缩 r 个单位长度,然后这些边所围成的内部区域,就是圆心的合法范围,该范围也是一个多边形,假设面积是\(a\),周长是\(b\),那么可以知道圆可以覆盖的面积 ...

  9. HDU校赛 | 2019 Multi-University Training Contest 1

    2019 Multi-University Training Contest 1 http://acm.hdu.edu.cn/contests/contest_show.php?cid=848 100 ...

随机推荐

  1. 如何官网下载chrome谷歌浏览器离线安装包

    目录 1. 下载步骤 2. 将语言更改为中文 3. 插件 3.1. chrome 网上应用店 3.1.1. google-access-helper 4. 更新失败 1. 下载步骤 注意 需要梯子才能 ...

  2. md5sum 计算和校验文件的md5值

    1. 命令功能 md5算法一般用于检查文件完整性, 2. 语法格式 md5sum  [option]  [file] 参数 参数说明 -b 以二进制模式读入文件 -t 以文本模式读入文件 -c 用来从 ...

  3. 为什么需要bootloader

    本文链接:https://blog.csdn.net/u012351051/article/details/50557899 受单片机和ARM7等小型CPU设备编程思维的影响,开始对嵌入式linux和 ...

  4. docker中pull镜像,报错 pull access denied for ubantu, repository does not exist or may require 'docker login'

    报错说明:拒绝获取ubantu,  仓库不存在或者需要登录docker 1.先尝试注册docker 2.在拉镜像前,先登录docker, 命令:docker  login 3.然后执行 docker ...

  5. 企业级监控软件Zabbix搭建部署之zabbix在WEB页面中的配置

    企业级监控软件zabbix搭建部署之zabbix在WEB页面中的配置 企业级监控软件zabbix搭建部署之zabbix在WEB页面中的配置 关于安装请看 http://www.linuxidc.com ...

  6. RPC的解释以及RPC和Restful、RPC和RMI的区别

    如何科学的解释RPC 说起RPC,就不能不提到分布式,这个促使RPC诞生的领域. 假设你有一个计算器接口,Calculator,以及它的实现类CalculatorImpl,那么在系统还是单体应用时,你 ...

  7. 在一个div上增加遮罩

    有一个需求是给一个视频增加遮罩 我研究了下 抽象出来就是给一个div增加遮罩 原理是:最外层的div使用relative定位     然后里面放两个子div  一个是不被遮的  另一个是遮罩(用abs ...

  8. 关于VS调试

    环境配置始终是我的弱项,碰到关于环境配置的问题就各种束手无策.但是这种事情,不能总凑合着,尤其你进不去环境或者没法调试的时候,代码写的多漂亮都没用.下面就来说一下最近关于调试的了解. 首先我们现在的项 ...

  9. spring boot 1.视图解析器,2.开启静态资源访问

    1.spring boot 视图解析器 #视图解析器 #前缀spring.mvc.view.prefix=/pages/ #后缀..jsp.dospring.mvc.view.suffix=.jsp ...

  10. luogu P4103 [HEOI2014]大工程 虚树 + 树形 DP

    Description 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道.  我们这个国家位置非常特殊,可以看成是一个单位边权的树,城市位于顶点上.  在 2 个国家 a,b 之间建一条新通 ...