洛谷.3803.[模板]多项式乘法(NTT)
为什么和那些差那么多啊。。
在这里记一下原根
Definition
阶
若\(a,p\)互质,且\(p>1\),我们称使\(a^n\equiv 1\ (mod\ p)\)成立的最小正整数\(n\)为\(a\)模\(p\)的阶,记作\(\delta_p(a)\)。
例:\(\delta_7(2)=3\)。
原根
设\(p\)是正整数,\(a\)是整数,若\(\delta_p(a)=\varphi(m)\),则称\(a\)为模\(p\)的一个原根。
从另一方面来说,若\(g^i\ mod\ p\neq g^j\ mod\ p\ (p为质数,i\neq j且i,j\in\left[1,p-1\right])\),则\(g\)为\(p\)的原根。
性质
1. 若\(p\)有原根,那么\(p\)有\(\varphi(\varphi(p))\)个原根。
2. 有原根的数只有:\(2,4,p^n,2\times p^n\) (\(p\)为奇素数,\(n\)为正整数)。
3. 一个数的最小原根的大小是\(O(n^{0.25})\)的。
4. 若\(g\)为\(p\)的原根,则\(g^a\)为\(p\)的原根的充要条件为 \(a\)与\(\varphi(p)\)互质。
(参考抄自这儿)
求法
求\(p\)的原根:对\(\varphi(p)=p-1\)分解质因子,即令\(p-1=\prod_{i=1}^kp_i^{a_i}\ (p_i为质数)\)
若\(g^{\frac{p-1}{p_i}}\neq 1\ (mod\ p)\)恒成立,则\(g\)为\(p\)的一个原根。
#include <cstdio>
#include <cctype>
#include <algorithm>
#define P (998244353)
#define G (3)
#define inv_G (332748118)
//#define gc() getchar()
#define MAXIN 300000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=(1<<21)+5;//2 097 152 //2e6+5;
int n,m,rev[N];
LL A[N],B[N],inv_lim;//全换成int好像大概略快吧
char IN[MAXIN],*SS=IN,*TT=IN;
inline int read()
{
register char c=gc();
for(;!isdigit(c);c=gc());
return c-'0';//233
}
inline LL FP(LL x,LL k)
{
LL t=1;
for(; k; k>>=1,x=x*x%P)
if(k&1) t=t*x%P;
return t;
}
void NTT(LL *a,int lim,int type)
{
for(int i=0; i<lim; ++i)
if(i<rev[i]) std::swap(a[i],a[rev[i]]);
for(int i=2; i<=lim; i<<=1)
{
int mid=i>>1;
LL Wn=FP(~type?G:inv_G,(P-1)/i),t,w;
for(int j=0; j<lim; j+=i)
{
LL w=1;
for(int k=0; k<mid; ++k, w=w*Wn%P)
a[j+k+mid]=(a[j+k]-(t=w*a[j+k+mid]%P)+P)%P,
a[j+k]=(a[j+k]+t)%P;
}
}
if(type==-1) for(int i=0; i<lim; ++i) a[i]=a[i]*inv_lim%P;
}
int main()
{
scanf("%d%d",&n,&m);//sb了拿那个read读n,m。。
for(int i=0; i<=n; ++i) A[i]=read();//(read()%P+P)%P
for(int i=0; i<=m; ++i) B[i]=read();
int lim=1,len=0;
while(lim<=n+m) lim<<=1,++len;
inv_lim=FP(lim,P-2);
for(int i=1; i<lim; ++i)
rev[i] = (rev[i>>1]>>1) | ((i&1)<<len-1);
NTT(A,lim,1), NTT(B,lim,1);
for(int i=0; i<lim; ++i) A[i]=A[i]*B[i]%P;
NTT(A,lim,-1);
for(int i=0; i<=n+m; ++i) printf("%lld ",A[i]);
return 0;
}
洛谷.3803.[模板]多项式乘法(NTT)的更多相关文章
- 洛谷.3803.[模板]多项式乘法(FFT)
题目链接:洛谷.LOJ. FFT相关:快速傅里叶变换(FFT)详解.FFT总结.从多项式乘法到快速傅里叶变换. 5.4 又看了一遍,这个也不错. 2019.3.7 叕看了一遍,推荐这个. #inclu ...
- 洛谷.4512.[模板]多项式除法(NTT)
题目链接 多项式除法 & 取模 很神奇,记录一下. 只是主要部分,更详细的和其它内容看这吧. 给定一个\(n\)次多项式\(A(x)\)和\(m\)次多项式\(D(x)\),求\(deg(Q) ...
- 洛谷.4238.[模板]多项式求逆(NTT)
题目链接 设多项式\(f(x)\)在模\(x^n\)下的逆元为\(g(x)\) \[f(x)g(x)\equiv 1\ (mod\ x^n)\] \[f(x)g(x)-1\equiv 0\ (mod\ ...
- 洛谷.4721.[模板]分治FFT(NTT)
题目链接 换一下形式:\[f_i=\sum_{j=0}^{i-1}f_jg_{i-j}\] 然后就是分治FFT模板了\[f_{i,i\in[mid+1,r]}=\sum_{j=l}^{mid}f_jg ...
- 洛谷 P4245 [模板]任意模数NTT —— 三模数NTT / 拆系数FFT(MTT)
题目:https://www.luogu.org/problemnew/show/P4245 用三模数NTT做,需要注意时间和细节: 注意各种地方要取模!传入 upt() 里面的数一定要不超过2倍 m ...
- 洛谷.4245.[模板]任意模数NTT(MTT/三模数NTT)
题目链接 三模数\(NTT\): 就是多模数\(NTT\)最后\(CRT\)一下...下面两篇讲的都挺明白的. https://blog.csdn.net/kscla/article/details/ ...
- 洛谷 P4512 [模板] 多项式除法
题目:https://www.luogu.org/problemnew/show/P4512 看博客:https://www.cnblogs.com/owenyu/p/6724611.html htt ...
- 洛谷 P4238 [模板] 多项式求逆
题目:https://www.luogu.org/problemnew/show/P4238 看博客:https://www.cnblogs.com/xiefengze1/p/9107752.html ...
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
随机推荐
- 关于new Handler()与new Handler(Looper.getMainLooper())区别
如果你不带参数的实例化:Handler handler=new Handler();那么这个会默认用当前线程的Looper对象. 一般而言,如果你的Handler是要用来刷新UI的,那么就需要在主线程 ...
- Centos6.5下搭建nagios详解
一.LAMP环境部署 1.安装php 1.安装yum源 rpm -Uvh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-releas ...
- ubuntu复制文件或目录
转自http://www.linuxidc.com/Linux/2008-11/17179.htm cp(copy)命令 该命令的功能是将给出的文件或目录拷贝到另一文件或目录中. 语法: cp [选项 ...
- 渗透测试的WINDOWS NTFS技巧集合
译者:zzzhhh 这篇文章是来自SEC Consult Vulnerability Lab的ReneFreingruber (@ReneFreingruber),分享了过去几年从各种博客文章中收集的 ...
- TCP检验和
TCP的检验和 检验和目的 目的是为了发现TCP首部和数据在发送端到接收端之间发生的任何改动.如果接收方检测到检验和有差错,则TCP段会被直接丢弃. TCP在计算检验和时,要加上一个12字节的伪首 ...
- DevExpress 行事历(Scheduler)的常用属性、事件和方法
一.TcxScheduler[TcxScheduler常用属性]1.Storage - 邦定一个Storage为Scheduler显示提供数据 2.DateNavigate.ColCount ...
- LINUX修改、增加IP的方法,一张网卡绑定多个IP/漂移IP【转】
临时增加IP命令:ifconfig eth0:1 ip地址 netmask 子网码 broadcast 广播地址 gateway 网关 ifconfig eth0:1 10.1.104.65 net ...
- java基础51 IO流技术(打印流)
1.打印流(printStream)的概念 打印流可以打印任意的数据类型 2.printStream的步骤 1.找到目标文件 2.创建一个打印流 3.打印信息 4.关闭资源 3.实例 ...
- php-fpm和cgi,并发响应的理解以及高并发和多线程的关系
首先搞清楚php-fpm与cgi的关系 cgi cgi是一个web server与cgi程序(这里可以理解为是php解释器)之间进行数据传输的协议,保证了传递的是标准数据. php-cgi php-c ...
- 强大的vi的几个功能
1 拷贝第十行到第十三行到文件a中,不用!亦可 : 比如你要拷贝从第10行到第109行到文件123.txt中,可以用以下的命令:10,109w!123.txt