[BZOJ 3992] [SDOI 2015] 序列统计
Description
Solution
〖一〗
设 \(f[i][j]\) 表示前 \(i\) 个数的乘积在模 \(p\) 意义下等于 \(j\) 的方案数,有
\]
其中 \(h[i]\) 表示 \(S\) 中模 \(p\) 等于 \(i\) 的元素个数。
〖二〗
设 \(g\) 为模数 \(p\) 的原根,根据原根的性质可知 \(g^1\cdots g^{p-1}\) 互不相同,设 \(f[i][j]\) 表示前 \(i\) 个数的乘积在模 \(p\) 意义下等于 \(g^j\) 的方案数,有
\]
其中 \(h[i]\) 表示 \(S\) 中模 \(p\) 等于 \(g^i\) 的元素个数。
于是可以化成多项式的形式:
\]
Code
#include <cmath>
#include <cstdio>
#include <algorithm>
const int N = 16390, P = 1004535809, G = 3, Gi = 334845270;
int n, m, x, y, s, g, nn, mm, vis[8002], R[N], h[N], a[N], L, inv;
int read() {
int x = 0; char c = getchar();
while (c < '0' || c > '9') c = getchar();
while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + (c ^ 48), c = getchar();
return x;
}
int ksm(int a, int b, int p) {
int res = 1;
for (; b; b >>= 1, a = 1LL * a * a % p)
if (b & 1) res = 1LL * res * a % p;
return res;
}
int getroot(int x) {
if (x == 2) return 1;
int m = sqrt(x - 1);
for (int i = 2; ; ++i) {
bool ok = 1;
for (int j = 2; j <= m; ++j)
if (ksm(i, (x - 1) / j, x) == 1) { ok = 0; break; }
if (ok) return i;
}
}
void NTT(int *A, int f) {
for (int i = 0; i < nn; ++i) if (i < R[i]) std::swap(A[i], A[R[i]]);
for (int i = 1; i < nn; i <<= 1) {
int wn = ksm(f == 1 ? G : Gi, (P - 1) / (i << 1), P);
for (int j = 0, r = i << 1; j < nn; j += r) {
int w = 1;
for (int k = 0; k < i; ++k, w = 1LL * w * wn % P) {
int x = A[j + k], y = 1LL * w * A[i + j + k] % P;
A[j + k] = (x + y) % P, A[i + j + k] = (x - y + P) % P;
}
}
}
}
void mul(int *a, int *b) {
int c[N] = {}, d[N] = {};
for (int i = 1; i < m; ++i) c[i] = a[i], d[i] = b[i];
NTT(c, 1), NTT(d, 1);
for (int i = 0; i < nn; ++i) a[i] = 1LL * c[i] * d[i] % P;
NTT(a, -1);
for (int i = 0; i <= mm; ++i) a[i] = 1LL * a[i] * inv % P;
for (int i = m; i <= mm; ++i) {
a[i - m + 1] += a[i];
if (a[i - m + 1] >= P) a[i - m + 1] -= P;
a[i] = 0;
}
}
void fastpow(int b) {
for (; b; b >>= 1, mul(a, a))
if (b & 1) mul(h, a);
}
int main() {
n = read(), m = read(), x = read(), s = read();
g = getroot(m);
for (int i = 1; i <= s; ++i) vis[read()] = 1;
for (int i = 1, t; i < m; ++i) {
t = ksm(g, i, m), h[i] = a[i] = vis[t];
if (x == t) y = i;
}
mm = (m - 1) << 1;
for (nn = 1; nn <= mm; nn <<= 1) ++L;
inv = ksm(nn, P - 2, P);
for (int i = 0; i < nn; ++i) R[i] = (R[i >> 1] >> 1) | ((i & 1) << (L - 1));
fastpow(n - 1);
printf("%d\n", h[y]);
return 0;
}
[BZOJ 3992] [SDOI 2015] 序列统计的更多相关文章
- [BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT)
[BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT) 题面 小C有一个集合S,里面的元素都是小于质数M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数 ...
- BZOJ 3992 [SDOI 2015] 序列统计 解题报告
这个题最暴力的搞法就是这样的: 设 $Dp[i][j]$ 为前 $i$ 个数乘积为 $j$ 的方案数. 转移的话就不多说了哈... 当前复杂度 $O(nm^2)$ 注意到,$M$ 是个质数,就说明 $ ...
- [SDOI 2015]序列统计
Description 题库链接 给出集合 \(S\) ,元素都是小于 \(M\) 的非负整数.问能够生成出多少个长度为 \(N\) 的数列 \(A\) ,数列中的每个数都属于集合 \(S\) ,并且 ...
- 【BZOJ 4403】 4403: 序列统计 (卢卡斯定理)
4403: 序列统计 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 653 Solved: 320 Description 给定三个正整数N.L和R, ...
- [BZOJ 4818] [SDOI 2017] 序列计数
Description Alice想要得到一个长度为 \(n\) 的序列,序列中的数都是不超过 \(m\) 的正整数,而且这 \(n\) 个数的和是 \(p\) 的倍数. Alice还希望,这 \(n ...
- BZOJ 3990 [SDOI 2015] 排序 解题报告
这个题哎呀...细节超级多... 首先,我猜了一个结论.如果有一种排序方案是可行的,假设这个方案是 $S$ . 那么我们把 $S$ 给任意重新排列之后,也必然可以构造出一组合法方案来. 于是我们就可以 ...
- BZOJ 3993 [SDOI 2015] 星际战争 解题报告
首先我们可以二分答案. 假设当前二分出来的答案是 $Ans$ ,那么我们考虑用网络流检验: 设武器为 $X$,第 $i$ 个武器的攻击力为 $B_i$: 设机器人为 $Y$,第 $i$ 个机器人的装甲 ...
- [BZOJ 3992][SDOI2015]序列统计
3992: [SDOI2015]序列统计 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 2275 Solved: 1090[Submit][Stat ...
- BZOJ 3992: [SDOI2015]序列统计 [快速数论变换 生成函数 离散对数]
3992: [SDOI2015]序列统计 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 1017 Solved: 466[Submit][Statu ...
随机推荐
- java新知识系列 三
1:trycatch中需要注意的地方. 2:ServletConfig以及ServletContext对象. 3: Spring事务属性的种类: 传播行为.隔离级别.只读和事务超时. 5:关于程序 ...
- 给IConfiguration写一个GetAppSetting扩展方法
给 IConfiguration 写一个 GetAppSetting 扩展方法 Intro 在 .net core 中,微软已经默认使用 appsettings.json 来代替 app.config ...
- Python字典、集合之高山流水
字典dict字典是由大括号{键:值}组成.字典是无序的.字典的键必须是不可变数据类型.不能使用列表作为键,但可以使用元祖作为字典的键.例如: dict_ = {"test":&qu ...
- Serverless架构
什么是Serverless架构 Servlerless 架构是新兴的架构体系,在Serverless 架构中,开发者无需考虑服务器的问题,计算资源作为服务而不是服务器的概念出现,这样,开发者只需要关注 ...
- SQLServer之FOREIGN KEY约束
FOREIGN KEY约束添加规则 1.外键约束并不仅仅可以与另一表的主键约束相链接,它还可以定义为引用另一个表中 UNIQUE 约束的列. 2.如果在 FOREIGN KEY 约束的列中输入非 NU ...
- django url分发,视图,模板回顾
Django基础轮廓 MTV+controller 一 url分发系统: 1 简单使用 url(r'^articles/2003/$', views.special_case_2003), # spe ...
- UVA - 11374 - Airport Express(堆优化Dijkstra)
Problem UVA - 11374 - Airport Express Time Limit: 1000 mSec Problem Description In a small city c ...
- Linux:Day12(下) 进程、任务计划
vmstat命令: vmstat [options] [delay [ count]] procs: r:等待运行的进程的个数: b:处于不可中断睡眠态的进程个数:(被阻塞的队列的长度): memor ...
- ESP8266产品ID
ESP.getChipId() https://github.com/espressif/arduino-esp32/blob/master/libraries/ESP32/examples/Chip ...
- 使用maven时出现Failure to transfer 错误的解决方法
在eclipse里使用maven,连接nexus私服. 添加依赖之后,总是报添加的依赖jar文件找不到,但是在nexus的库里面能找到这个依赖的jar文件,但是在本地的maven库里面找不到,于是我将 ...