原根求解算法:

获取一个数\(N\)的原根\(root\)的算法

#include<bits/stdc++.h>
#define ll long long
#define IL inline
#define RG register
using namespace std; ll prm[1000],tot,N,root; ll Power(ll bs,ll js,ll MOD){
ll S = 1,T = bs;
while(js){
if(js&1)S = S*T%MOD;
T = T*T%MOD;
js >>= 1;
} return S;
} IL ll GetRoot(RG ll n){
RG ll tmp = n - 1 , tot = 0;
for(RG ll i = 2; i <= sqrt(tmp); i ++){
if(tmp%i==0){
prm[++tot] = i;
while(tmp%i==0)tmp /= i;
}
}
if(tmp != 1)prm[++tot] = tmp; //质因数分解
for(RG ll g = 2; g <= n-1; g ++){
bool flag = 1;
for(RG int i = 1; i <= tot; i ++){ //检测是否符合条件
if(Power(g,(n-1)/prm[i],n) == 1)
{ flag = 0; break; }
}
if(flag)return g;
}return 0; //无解
} int main(){
cin >> N;
root = GetRoot(N);
cout<<root<<endl;
return 0;
}

快速数论变换算法:

计算多项式\(f_1*f_2\)在模\(P\) (\(P\)为质数) 意义下的卷积。

讲真的,只要把\(FFT\)的单位复数根换成原根就行了。

注意要提前用上面的算法把模数的原根算出来。

#define mod 998244353     //使用NTT需要保证模数mod 为质数
const ll pr = 3;
//3是998244353的原根,在比赛中请用上面那个算法提前算出.... ll f1[_],f2[_],U,V;
ll wn[50],R[_],N,M,n,m,l,ans[_]; IL ll Power(RG ll bs,RG ll js){
RG ll S = 1 , T = bs;
while(js){if(js&1)S=S*T%mod; T=T*T%mod; js>>=1;}
return S;
} IL void GetWn(){
//需要计算floor(log n)个原根
for(RG int i = 0; i <= 25; i ++){
RG ll tt = 1<<i;
wn[i] = Power(pr,(mod-1)/tt);
}return;
} IL void NTT(RG ll P[],RG int opt){
for(RG int i = 0; i < n; i ++)
if(i < R[i]) swap(P[R[i]],P[i]);
for(RG int i = 1,id = 0; i < n; i<<=1){
id ++;
for(RG int j = 0,p = i<<1; j < n; j += p){
RG ll w = 1;
for(RG int k = 0; k < i; k ++,w = w*wn[id]%mod){
U = P[j+k]; V = w*P[j+k+i];
P[j+k] = (U+V)%mod; P[j+k+i] = ((U-V)%mod+mod)%mod;
}
}
}
if(opt == -1){
//caution:反转时是从1开始 for !!!!!
for(RG int i = 1; i < n/2; i ++)swap(P[i],P[n-i]);
RG ll inv = Power(n,mod-2);
for(RG int i = 0; i < n; i ++)P[i] = P[i]%mod*inv%mod;
}return;
} int main(){
//读入数据:
cin >> N >> M;
for(RG int i = 0; i <= N; i ++)cin >> f1[i];
for(RG int i = 0; i <= M; i ++)cin >> f2[i]; //NTT计算:
m = N+M; l = 0;
for(n = 1; n <= m; n<<=1) ++ l;
for(RG int i = 0; i < n; i ++)
R[i] = (R[i>>1]>>1) | ((i&1)<<(l-1));
GetWn();
NTT(f1,1); NTT(f2,1);
for(RG int i = 0; i < n; i ++)f1[i] = f1[i]*f2[i]%mod;
NTT(f1,-1); //转移答案:
for(RG int i = 0; i <= m; i ++)ans[i] = f1[i];
for(RG int i = 0; i <= m; i ++)cout<<ans[i]<<" ";
return 0;
}

原根求解算法 && NTT算法的更多相关文章

  1. PCB仿真软件与电磁场求解器的算法

    1. 简介 目前商业化的PCB仿真软件主要有: Cadence公司的Sigrity.Ansys公司的SIwave/HFSS.CST公司的CST.Mentor公司的HyperLynx.Polor公司的S ...

  2. LP线性规划求解 之 单纯形 算法

    LP线性规划求解 之 单纯形 算法 认识-单纯形 核心: 顶点旋转 随机找到一个初始的基本可行解 不断沿着可行域旋转(pivot) 重复2,直到结果不能改进为止 案例-过程 以上篇的case2的松弛型 ...

  3. GMM算法k-means算法的比较

    1.EM算法 GMM算法是EM算法族的一个具体例子. EM算法解决的问题是:要对数据进行聚类,假定数据服从杂合的几个概率分布,分布的具体参数未知,涉及到的随机变量有两组,其中一组可观测另一组不可观测. ...

  4. 简单易学的机器学习算法——EM算法

    简单易学的机器学习算法——EM算法 一.机器学习中的参数估计问题 在前面的博文中,如“简单易学的机器学习算法——Logistic回归”中,采用了极大似然函数对其模型中的参数进行估计,简单来讲即对于一系 ...

  5. 最短路径算法-Dijkstra算法的应用之单词转换(词梯问题)(转)

    一,问题描述 在英文单词表中,有一些单词非常相似,它们可以通过只变换一个字符而得到另一个单词.比如:hive-->five:wine-->line:line-->nine:nine- ...

  6. 理解Liang-Barsky裁剪算法的算法原理

    0.补充知识向量点积:结果等于0, 两向量垂直; 结果大于0, 两向量夹角小于90度; 结果小于0, 两向量夹角大于90度.直线的参数方程:(x1, y1)和(x2, y2)两点确定的直线, 其参数方 ...

  7. 经典算法 KMP算法详解

    内容: 1.问题引入 2.暴力求解方法 3.优化方法 4.KMP算法 1.问题引入 原始问题: 对于一个字符串 str (长度为N)和另一个字符串 match (长度为M),如果 match 是 st ...

  8. 经典算法 Manacher算法详解

    内容: 1.原始问题   =>O(N^2) 2.Manacher算法   =>O(N) 1.原始问题 Manacher算法是由题目“求字符串中长回文子串的长度”而来.比如 abcdcb 的 ...

  9. 最小生成树(Prim算法+Kruskal算法)

    什么是最小生成树(MST)? 给定一个带权的无向连通图,选取一棵生成树(原图的极小连通子图),使生成树上所有边上权的总和为最小,称为该图的最小生成树. 求解最小生成树的算法一般有这两种:Prim算法和 ...

随机推荐

  1. js小技巧:数组去重

    JavaScript 数组中去除重复的数据 var arr = [1, 2, 2, 3, '1', null, 'a', 'b', 'a']; var t = {}; var result = arr ...

  2. Linux 虚拟IP

    虚拟IP Linux网卡上绑定另一个虚拟ip,即网卡上一个真实ip一个虚拟ip.当然通过这2个ip都可以连接到该主机. 实现原理主要是靠TCP/IP的ARP协议.因为ip地址只是一个逻辑 地址,在以太 ...

  3. 存个emacs配置

    emacs配置 (global-set-key [f9] 'compile-file) (global-set-key [f10] 'gud-gdb) (global-set-key (kbd &qu ...

  4. MYSQL EXPLAIN执行计划命令详解(支持更新中)

    本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 摘要: 本篇是根据官网中的每个一点来翻译.举例.验证的:英语不好,所 ...

  5. [翻译] 编写高性能 .NET 代码--第二章 GC -- 配置选项

    配置选项 在基于"less rope to hang yourself with"思想下,.NET 框架没有给开发提供很多太多的配置选项.但在大多数情况下,GC会跟你的硬件配置,及 ...

  6. .net 分割字符串

    string a = "1-2-3-4-5-6-7-8-9"; string[] b = a.Split(new Char[] { '-' }); for (int i = 0; ...

  7. Yii2框架ACF(AccessControl Filter)的使用

    AccessControl其实也就是 yii\filters\AccessControl Filter, 我们下面简写为 ACF 作为描述. ACF,访问控制过滤器,适用于简单的验证,面对的对象便是控 ...

  8. (MonoGame从入门到放弃-3)-放弃MonoGame

    又一段时间过去了,这一章没内容了.我真的已经放弃MonoGame的学习了,MonoGame用起来感觉就是在自己实现2d游戏引擎一样,好多现代游戏引擎有的内容都没有...,我只是想做游戏,而不是给引擎添 ...

  9. AutoMapper 使用心得

    在很久之前就已经有了解到AutoMapper 这一个组件了,但是却一直不明白这个东西要怎么使用,是用来干什么的.经过几经周折之后,看了资料大概5.6次吧,总算理解其中的用途和原理(请原谅我理解能力太差 ...

  10. python环境jieba分词的安装

    我的python环境是Anaconda3安装的,由于项目需要用到分词,使用jieba分词库,在此总结一下安装方法. 安装说明======= 代码对 Python 2/3 均兼容 * 全自动安装:`ea ...