原根求解算法 && NTT算法
原根求解算法:
获取一个数\(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算法的更多相关文章
- PCB仿真软件与电磁场求解器的算法
1. 简介 目前商业化的PCB仿真软件主要有: Cadence公司的Sigrity.Ansys公司的SIwave/HFSS.CST公司的CST.Mentor公司的HyperLynx.Polor公司的S ...
- LP线性规划求解 之 单纯形 算法
LP线性规划求解 之 单纯形 算法 认识-单纯形 核心: 顶点旋转 随机找到一个初始的基本可行解 不断沿着可行域旋转(pivot) 重复2,直到结果不能改进为止 案例-过程 以上篇的case2的松弛型 ...
- GMM算法k-means算法的比较
1.EM算法 GMM算法是EM算法族的一个具体例子. EM算法解决的问题是:要对数据进行聚类,假定数据服从杂合的几个概率分布,分布的具体参数未知,涉及到的随机变量有两组,其中一组可观测另一组不可观测. ...
- 简单易学的机器学习算法——EM算法
简单易学的机器学习算法——EM算法 一.机器学习中的参数估计问题 在前面的博文中,如“简单易学的机器学习算法——Logistic回归”中,采用了极大似然函数对其模型中的参数进行估计,简单来讲即对于一系 ...
- 最短路径算法-Dijkstra算法的应用之单词转换(词梯问题)(转)
一,问题描述 在英文单词表中,有一些单词非常相似,它们可以通过只变换一个字符而得到另一个单词.比如:hive-->five:wine-->line:line-->nine:nine- ...
- 理解Liang-Barsky裁剪算法的算法原理
0.补充知识向量点积:结果等于0, 两向量垂直; 结果大于0, 两向量夹角小于90度; 结果小于0, 两向量夹角大于90度.直线的参数方程:(x1, y1)和(x2, y2)两点确定的直线, 其参数方 ...
- 经典算法 KMP算法详解
内容: 1.问题引入 2.暴力求解方法 3.优化方法 4.KMP算法 1.问题引入 原始问题: 对于一个字符串 str (长度为N)和另一个字符串 match (长度为M),如果 match 是 st ...
- 经典算法 Manacher算法详解
内容: 1.原始问题 =>O(N^2) 2.Manacher算法 =>O(N) 1.原始问题 Manacher算法是由题目“求字符串中长回文子串的长度”而来.比如 abcdcb 的 ...
- 最小生成树(Prim算法+Kruskal算法)
什么是最小生成树(MST)? 给定一个带权的无向连通图,选取一棵生成树(原图的极小连通子图),使生成树上所有边上权的总和为最小,称为该图的最小生成树. 求解最小生成树的算法一般有这两种:Prim算法和 ...
随机推荐
- WPF DataTriger 用法示例代码
用法1: <DataGridTemplateColumn Header="{lex:LocText ExamineRoom}"> <DataGridTemplat ...
- iOS UITableView的多选
一些列表经常需要编辑多选的功能,而UITableview自带多选删除的功能,使用起来方便,不需要自己去做数据存储和选中状态转换,可以减少不少开发时间.下面就来介绍下UITableView多选的使用. ...
- PH日期格式化
%M 月名字(January--December) %W 星期名字(Sunday--Saturday) %D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等.) %Y 年, 数字, 4 位 ...
- WinServer2012 R2忘记密码的解决方案+远程连接另一种莫名其妙故障
http://www.cnblogs.com/dunitian/p/4822808.html#iis 之前朋友有问道我WinServer2003密码破解的事情,基本上密码忘记了都是进PE用密码清除的工 ...
- C#中引用变量是否应该加ref?
看如下代码: void Test(T t); void Test(ref T t); 当T是值类型的时候,很好判断,第一种并不能改变方法外变量的值,需要第二种方法才可以.通过查看IL代码,可以看到 ...
- 常见JedisConnectionException异常分析
异常内容:我看了很多人的博客,千篇一律都是说redis.conf文件的配置问题,发现并不能解决我的问题,今天写这个博客讲解一下我的解决办法: 遇到这个问题第一步:查看虚拟机的防火墙是否关闭,测试方法就 ...
- 原创:实现ehcache动态创建cache,以及超期判断的具体逻辑
当前最常用的三个缓存组件:ehcache.redis.memcached 其中,ehcache与应用共同运行于JVM中,属于嵌入式组件,运行效率最高,因此常被用于实现一级缓存. 在更复杂的一些系统中, ...
- EmguCV 绘画图形
1.Image类中绘图常用函数列表 实践验证 ///初始化图片 private void Form1_Load(object sender, EventArgs e) { oldpic = new E ...
- 利用Apache配置本地 自定义域名
第一步:配置 httpd.conf 开启 虚拟主机 配置模块 去掉 " Include conf/extra/httpd-vhosts.conf " 前面的" # &qu ...
- Git创建本地分支并推送到远程github仓库