Description:

你在一个有n 个点的环上,环上点按逆时针顺序标号为0 到n - 1。你一
开始在0 号点。你在每一回合可以使用k 种传送中的一种,第i 种传送会将你
按逆时针方向移动ai 个点。有m 个限制条件,对于每个限制条件(xi; yi),要
求不能在第xi 步之后在yi 号点上。你要求出经过l 步之后在0 号点的方案数
模998244353。

题解:

直接NTT?

O(mnlog2n)O(mnlog^2n)成功拿到60分。

考虑优化一下.

现在把转移数组看作c.

要求ckc^k。

正常做法:快速幂NTT

一次复杂度:O(nlog2n)O(n log^2 n )

在这道题中,n是二的整次幂,所以模n刚好回到原位,其实有:
DFT(c∗c)=DFT(c)∗DFT(c)DFT(c*c)=DFT(c)*DFT(c)

因此可以先对c进行DFT点值运算,搞个k次幂,再插值回来。

这为什么是对的?

还记得为什么FFT要开两倍。

因为它实际上是一个循环卷积。

c=a∗bc=a*b
c(i+j) mod n=∑n−1i=0∑n−1j=0a[i]∗b[j]c_{(i+j)~mod ~n}=\sum_{i=0}^{n-1}\sum_{j=0}^{n-1}a[i]*b[j]

随便你用点积自我乘个无数遍,它都会刚好溢出,溢出就是mo个次数界,这里的次数界=n*2,刚好符合我们的需求。

因此复杂度降为O(mnlogn)O(mnlogn)

Code:

#include<cstdio>
#include<algorithm>
#define ll long long
#define fo(i, x, y) for(int i = x; i <= y; i ++)
#define ff(i, x, y) for(int i = x; i < y; i ++)
using namespace std;const int N = 2e5 + 5;const ll mo = 998244353;int n, l, m, k, x;ll s[N], b[N], c[N];struct node {int x, y;
} a[N];ll w[N], tx;ll ksm(ll x, ll y) {ll s = 1;for(; y; y /= 2, x = x * x % mo)if(y & 1) s = s * x % mo;return s;
}
void dft(ll *a, int n) {ff(i, 0, n) {int p = i, q = 0;fo(j, 1, tx) q = q * 2 + p % 2, p /= 2;if(q > i) swap(a[q], a[i]);}for(int m = 2; m <= n; m *= 2) {int h = m / 2;ff(i, 0, h) {ll W = w[i * (n / m)];for(int j = i; j < n; j += m) {int k = j + h;ll u = a[j], v = a[k] * W % mo;a[j] = (u + v) % mo; a[k] = (u - v + mo) % mo;}}}
}
ll ni;
void fft(ll *a, ll *b, int n) {dft(a, n); dft(b, n); ff(i, 0, n) a[i] = a[i] * b[i] % mo;fo(i, 0, n / 2) swap(w[i], w[n - i]);dft(a, n); ff(i, 0, n) a[i] = a[i] * ni % mo;fo(i, 0, n / 2) swap(w[i], w[n - i]);
}int cmp(node a, node b) {return a.x < b.x;
}int main() {scanf("%d %d", &n, &l);scanf("%d", &m);fo(i, 1, m) scanf("%d %d", &a[i].x, &a[i].y);scanf("%d", &k);fo(i, 1, k) {scanf("%d", &x);b[x] ++;}while(1 << tx ++ < n) tx ++;sort(a + 1, a + m + 1, cmp);s[0] = 1; a[0].x = 0; a[m + 1].x = l;int n0 = n;n = 1 << tx; ll v = ksm(3, (mo - 1) / n);w[0] = 1; fo(i, 1, n) w[i] = w[i - 1] * v % mo;dft(b, n);ni = ksm(n, mo - 2);fo(i, 1, m + 1) if(i == 1 || a[i].x != a[i - 1].x) {ff(j, 0, n) c[j] = ksm(b[j], a[i].x - a[i - 1].x);dft(s, n);ff(j, 0, n) s[j] = s[j] * c[j] % mo;fo(j, 0, n / 2) swap(w[j], w[n - j]);dft(s, n);ff(j, 0, n) s[j] = s[j] * ni % mo;fo(j, 0, n / 2) swap(w[j], w[n - j]);ff(j, n0, n) s[j % n0] = (s[j % n0] + s[j]) % mo, s[j] = 0;int l = i;while(l <= m && a[l].x == a[i].x) {s[a[l].y] = 0;l ++;}}printf("%lld", s[0]);
}

【NOI2015模拟YYT】传送相关推荐

  1. JZOJ 3819. 【NOI2015模拟9.9】取石子

    Description Input Output Sample Input 3 3 1 1 2 2 3 4 3 2 3 5 Sample Output YES NO NO Data Constrain ...

  2. JZOJ 3789. 【NOI2015模拟8.20】编辑器

    Description 你正在设计一种新型的编辑器,这种编辑器可以高效地处理整数序列. 编辑器启动时,序列为空,光标指向序列的头部.编辑器支持下列 5 种操作: 1. I x 把整数 x 插入到光标位 ...

  3. JZOJ 3786. 【NOI2015模拟8.19】图

    Description 给定一个 n 个点 m 条边的无向图,进行多次询问,每次询问点 a 是否能经过恰好 c 条边到达点 b(当然,可以对于一条边可以来回经过多次) . Input 第一行三个数 n ...

  4. JZOJ 3769. 【NOI2015模拟8.14】A+B

    Description 对于每个数字x,我们总可以把它表示成一些斐波拉切数字之和,比如8 = 5 + 3, 而22 = 21 + 1,因此我们可以写成 x = a1 * Fib1 + a2 * Fib ...

  5. jzoj3771. 【NOI2015模拟8.15】小 Z 的烦恼

    Description 小 Z 最近遇上了大麻烦,他的数学分析挂科了.于是他只好找数分老师求情. 善良的数分老师答应不挂他,但是要求小 Z 帮助他一起解决一个难题问题是这样的,现在有 n 个标号为 1 ...

  6. 【NOI2015模拟YDC】游戏

    Description 有一个有n个格子的东西,其中有一些格子中有棋子.每一次先手可以选择一个棋子移到它右边第一个没有棋子的位置.先占领格子n的玩家获胜.求先手必胜的方案数. n<=10^9,棋 ...

  7. 【JZOJ4178】【NOI2015模拟YDC】游戏(阶梯nim游戏)

    Problem Input Output Hint Solution 刚看到题就知道是正解想不出暴力打不出的博弈... 比赛时我也想了一会,但是只想到了40points... 40points:状压D ...

  8. 基于dtmf发送救援信息(gps坐标)传送的技术方案

    基于dtmf发送救援信息(gps坐标)传送的技术方案 项目发起地址:https://github.com/liangdas/dtmfsos 在医疗救护领域,抢救病人最关键的因素是能在最短的时间内到达现 ...

  9. I2C软件模拟EEPROM通讯实验

    I2C是一种串行通讯总线,由于只有串行数据线SDA和串行时钟线SCL两个总线而被广泛使用. I2C软件模拟通信的本质是用芯片上任意两个引脚模拟I2C通信,也就是说通过控制任意两个引脚电平的高低变化来模 ...

最新文章

  1. MySQL数据库从windows迁移到linux
  2. SpringMVC源代码学习(一)从HTttpServletBean到DispatcherServlet
  3. tensorflow-读写数据最佳代码组合方式
  4. 电脑下面的任务栏怎么取消隐藏_电脑桌面右下方任务栏的小图标如何隐藏
  5. 深度学习(四十六)Adversarial Autoencoders学习笔记
  6. 金融数据分析与挖掘实战 4.2 Matplotlib(二)
  7. 异常——Python
  8. ping命令执行过程详解
  9. web form常用控件
  10. iphone投屏老是显示无法连接服务器,iphone怎么投屏到电视 升级iOS11后为什么投屏会失败...
  11. pb中数据窗口函数小结(转)
  12. 曾被尊称为“教父级”人物的郭盛华,现在到底怎么样了?
  13. 数据分析-美国小孩英文名分析-可视化(含代码)
  14. 阿里云储道深度解析存储系统设计——NVMe SSD性能影响因素一探究竟
  15. Tumblr营销大法(一)
  16. POI单元格合并(合并后边框空白修复)、自动列宽、水平居中、垂直居中、设置背景颜色、设置字体等常见问题
  17. ZigBee--IAR新建、配置LED工程
  18. SpringBoot/Spring Cloud/Docker
  19. 【一生一芯01】预学习-PA1总结
  20. Base64 混淆加密+迭代次数,Base64前后端加解密不一致、Base64 js加解密结果与java加解密结果不一致,Base64中文加密乱码

热门文章

  1. 计算机蓝屏无法启动代码50,电脑蓝屏代码0x0000002E/3F/44/50的原因与解决方法
  2. 基于MQTT协议的远程监控-控制系统——ESP/STM32 MCUs 实现
  3. PSP上看电子书的好软件——BOOKr
  4. PCB 录屏工具Screen2Exe GifCam ScreenToGif
  5. python开发视频播放器_python_十几行代码实现简单播放器
  6. 人力资源机器下载方法
  7. Windows 系统第三方服务开发者可以借助 WSH (Windows Service Hardening) 机制提高安全性
  8. java批量上传文件_Java 批量大文件上传下载
  9. 3dmax里面cr材质转换vr材质_不花钱,教你学会VR与CR材质互转!
  10. jvm内存结构_2-JVM内存结构