原根求解算法 && 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算法和 ...
随机推荐
- PHP实现session对象封装
<?php class Session { private $db; // 设置数据库变量 private $expiry = 3600; // 设置Session失效时间 public fun ...
- python学习:简单的wc命令实现
#!/usr/bin/python import sys import os try: fn = sys.argv[1] except IndexError: print &q ...
- R语言-聚类与分类
一.聚类: 一般步骤: 1.选择合适的变量 2.缩放数据 3.寻找异常点 4.计算距离 5.选择聚类算法 6.采用一种或多种聚类方法 7.确定类的数目 8.获得最终聚类的解决方案 9.结果可视化 10 ...
- vim操作备忘录
vim操作备忘录 vim 备忘录 vim的书籍虽然看不不少,可是老是容易忘记,主要是自己操作总结过少,这个博客就主要用来记录一些比较常见的术语和操作,以防止自己再次忘记. <leader> ...
- 用yii2给app写接口(下)
上一节里我们讲了如何用Yii2搭建一个能够给App提供数据的API后台应用程序.那么今天我们就来探讨下授权认证和通过API接口向服务器提交数据以及如何控制API接口返回那些数据,不能返回那些数据. 授 ...
- Java--JDBC连接与Django--DATABASES设置
JDBC 简介 JDBC(Java Data Base Connectivity,java 数据库连接)是一种用于执行 SQL 语句的 JavaAPI,可以为多种关系 数据库提供统一访问,它由一组用 ...
- AssetBundle实现服务器下载并从本地读取
废话不多说 直接上代码. 从服务器下载的, 很简单 private IEnumerator Start() { byte[] ab = null; int len = 0; WWW www =nul ...
- ubuntu14.04 安装redis 2.8.9
ubuntu14.04安装前准备工作,为了保证安装顺利,请先执行apt-get update 然后安装make 和gcc(已安装的可忽略) apt-get install make apt-get i ...
- win10安装mongodb及配置 和 mongodb的基本使用(node环境)
mongodb安装 下载地址: https://www.mongodb.com/download-center 下载后,我们点击mongodb-win32-x86_64-2008plus-ssl-3. ...
- Centos中hive/hbase/hadoop/mysql实际操作及问题总结
目录 Hive中文乱码问题 hive和hbase的版本不一致 Ambari hive插入Hbase出错 Hive0.12和Hbase0.96不兼容,重新编译hive0.12.0 hiveserver不 ...