整理的算法模板合集: ACM模板

点我看算法全家桶系列!!!

实际上是一个全新的精炼模板整合计划


Weblink

https://www.luogu.com.cn/problem/P3321

Problem

Solution

关于离散对数的概念及其应用建议看我的《算法竞赛中的初等数论》 中的 0x61.3 整数的指标(也称指数、离散对数),哦还没更新到这儿啊,那没事了

题解建议看这里:https://www.luogu.com.cn/blog/ZigZagKmp/solution-p3321(借用离散对数将乘法转换成加法之后就是一个经典的计数问题了,非常简单。他写的实在是太好了,然后因为后天就要考毛概了我还没开始复习,题解我就懒得写了… )

不过他是先倍增预处理然后再将 nnn 二进制拆分,再组成 nnn 的方式,其实直接快速幂即可,一样是 O(logn)O(logn)O(logn) 常数会更小一点,还好写一些。

Code

// Problem: P3321 [SDOI2015]序列统计
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P3321
// Memory Limit: 125 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)#include <bits/stdc++.h>using namespace std;
#define int long long
using ll = long long;
const int N = 2e6 + 7, mod = 1004535809, G = 3;ll a[N], b[N], h[N];
int n, m, X, S, GG;
int limit, RR[N], L;
ll g[N], f[N], dtol[N], ltod[N];
vector<int>factor;int qpow(int a, int b, int mod = 1004535809)
{int res = 1;while(b){if(b & 1) res = 1ll * res * a % mod;a = 1ll * a * a % mod;b >>= 1;}return res;
}vector<int> get_factor(ll n)
{vector<int>res;for(int i = 1; i * i <= n; ++ i) {if(n % i == 0) {res.push_back(i);if(i != n / i) {res.push_back(n / i);}}}return res;
} void get_RT(int n)
{ll phi_m = n - 1;factor = get_factor(phi_m);for(int i = 2; i < n; ++ i) {bool flag = 1;for(int j = 0; j < (int)factor.size(); ++ j) {if(factor[j] != phi_m && qpow(i, factor[j], n) == 1) {flag = 0;break;}}if(flag) {GG = i;break;}}int tmp = 1;for(int i = 0; i < phi_m; ++ i, tmp = 1ll * tmp * GG % n)dtol[tmp] = i, ltod[i] = tmp;return ;
}ll inv(ll x) {return qpow(x, mod - 2);}void NTT(ll *A, int type = 1)
{for(int i = 0; i < limit; ++ i)if(i < RR[i])swap(A[i], A[RR[i]]);for(int mid = 1; mid < limit; mid <<= 1) {ll wn = qpow(G, (mod - 1) / (mid * 2));if(type == -1) wn = qpow(wn, mod - 2);for(int len = mid << 1, pos = 0; pos < limit; pos += len) {ll w = 1;for(int k = 0; k < mid; ++ k, w = (w * wn) % mod) {int x = A[pos + k], y = w * A[pos + mid + k] % mod;A[pos + k] = (x + y) % mod;A[pos + k + mid] = (x - y + mod) % mod;}}}if(type == -1) {ll limit_inv = inv(limit);for(int i = 0; i < limit; ++ i)A[i] = (A[i] * limit_inv) % mod;}
}void mul(ll *f, ll *g, ll *ans, int n, int m, int mod_len)
{limit = 1, L = 0;while(limit < n + m - 1) limit <<= 1, ++ L;for(int i = 0; i < limit; ++ i)RR[i] = (RR[i >> 1] >> 1) | ((i & 1) << (L - 1));   for(int i = 0; i < n; ++ i)a[i] = f[i];for(int i = n; i < limit; ++ i)a[i] = 0; for(int i = 0; i < m; ++ i)b[i] = g[i];for(int i = m; i < limit; ++ i)b[i] = 0;NTT(a), NTT(b);for(int i = 0; i < limit; ++ i) {a[i] = 1ll * a[i] * b[i] % mod;}NTT(a, -1);for(int i = 0; i < mod_len; ++ i)ans[i] = a[i];for(int i = mod_len; i < limit; ++ i)ans[i % mod_len] = (ans[i % mod_len] + a[i]) % mod;for(int i = mod_len; i < limit; ++ i)ans[i] = 0;
}signed main()
{scanf("%lld%lld%lld%lld", &n, &m, &X, &S);get_RT(m); for(int i = 1; i <= S; ++ i) {int x;scanf("%lld", &x);if(x != 0) {f[dtol[x]] ++ ;}}  g[0] = 1; while(n) {if(n & 1) mul(f, g, g, m - 1, m - 1, m - 1);mul(f, f, f, m - 1, m - 1, m - 1);n >>= 1;}printf("%lld\n", g[dtol[X]]);return 0;
}

P3321 [SDOI2015]序列统计(离散对数下NTT,乘法换加法)相关推荐

  1. 洛谷 - P3321 [SDOI2015]序列统计(原根+NTT)

    题目链接:点击查看 题目大意:给出一个集合 SSS,集合中的数是 [0,m)[0,m)[0,m) 且互不相同的,问从集合中选 nnn 次数字,且乘积对 mmm 取模后等于 xxx 的方案数有多少 题目 ...

  2. P3321 [SDOI2015]序列统计(未解决)

    P3321 [SDOI2015]序列统计 题意: 题解: 参考题解: 题解 P3321 [[SDOI2015]序列统计] [LG3321][SDOI2015]序列统计 神仙题..学透再补 代码:

  3. Luogu P3321 [SDOI2015]序列统计

    [SDOI2015]序列统计 题目描述 小C有一个集合\(S\),里面的元素都是小于\(M\)的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为\(N\)的数列,数列中的每个数都属于集合\( ...

  4. P3321 [SDOI2015]序列统计

    思路 首先有个挺显然的DP \[ dp[i][(j*k)\%m]+=dp[i-1][j]\times dp[i-1][k] \] 想办法优化这个DP 这个dp也可以写成这样 \[ dp[i][j]=\ ...

  5. 算法学习FFT系列(2):快速数论变换NTT bzoj3992: [SDOI2015]序列统计例题详解

    bzoj3992: [SDOI2015]序列统计 Description 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属 ...

  6. [SDOI2015]序列统计

    [SDOI2015]序列统计 很有趣的一道题目,很巧妙. 显然是一个dp,考虑最朴素的dp,f[i][j]表示选i个乘起来,%m为j的方案数为多少.转移也很简单. 然而乘法的转移并不能进行什么优化,于 ...

  7. BZOJ3992:[SDOI2015]序列统计——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3992 https://www.luogu.org/problemnew/show/P3321 小C ...

  8. [SDOI2015]序列统计 (NTT)

    Description 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属于集合S.小C用这个生成器生成了许多这样的数列. ...

  9. BZOJ3992[SDOI2015]序列统计

    题目链接 洛谷 BZOJ 解析 头一回知道原根还可以这么考-- 不难想到递推的做法\(dp[i][j]\)表示长度为\(i\),乘积为\(j\)的答案,那么\(dp[i][j \cdot a[i] \ ...

最新文章

  1. Spring servlet
  2. jvm性能调优实战 -57数据日志分析系统的OOM问题排查
  3. NHibernate Step By Step(2)-继承映射
  4. html怎样在一张图片里写字,用HTML代码在图片上写字
  5. MySQL学习笔记_关于MySQL的字符类型VARCHAR长度知识总结
  6. 车主吐槽某电动车保养割韭菜,却遭其总裁公开恐吓?车主:必须视频道歉
  7. 服务器端性能优化之CDN
  8. 免费视频素材下载(不定时更新)
  9. Gh0st整理资料1
  10. android蓝牙键盘光标,罗技K810背光蓝牙键盘快捷键大全
  11. 张正友标定法matlab,张正友标定法(相机标定)
  12. WEBRTC浅析(五)视频Nack包的发送判断逻辑以及数据流
  13. Oracle (03)分组子句.where条件 与 having条件的区别.子查询.DDL.DML.数据的增删改.TCL
  14. Prometheus自定义线程池指标暴露
  15. python 登录新浪微博_模拟登录新浪微博(Python) - 转
  16. SQL :Date 函数
  17. 豆腐干豆腐干地方的规定
  18. 【简单3d网络游戏制作】——基于Unity
  19. spdif数字传输规范
  20. Problem : [usaco2007 Feb]Lilypad Pond

热门文章

  1. 面试数百名NLP工程师发现:90%以上是不合格的
  2. 每日一题(进制转换)
  3. Classifying dynamic textures via spatiotemporal fractal analysis(许教授)
  4. 背包思想计算方案的总数(货币系统)
  5. Sequelize 4.43.0 发布,基于 Nodejs 的异步 ORM 框架
  6. python面向对象编程 -- 封装、继承
  7. 11g新特性:X$DBGALERTEXT一个很酷的内部视图
  8. 如何跨过Docker集群网络Weave遇到的“坑”?
  9. Tomcat架构(二)
  10. eclipse 搜索使用。