FFT多項式快速冪,對於x^num取模,順便再模一個998244353
多項式快速冪
時間限制 : 60000 MS 空間限制 : 524288 KB
問題描述:
給一個n次多項式,求它的k次方。沒關係,隨手模一個998244353就行了。沒關係,再隨手模一個xm就行了。
輸入格式:
第一行n,意義如上。
第二行n+1個數,a0,a1,…,an,分別是0,1,…,n次項係數。
第三行k,意義如上。
第四行m,意義如上。
輸出格式
一行,b0,b1,…,bm-1,分別是0,1,…,m-1次項係數。
樣例輸入
1
1 1
5
2
樣例輸出
1 5
提示
樣例解釋:
(1+x)5
=1+5x+10x2+10x3+5x4+x5
≡1+5x (mod x2)
資料範圍:
n,m<=100000
k<=1018
求逆元和exp的時候要使用牛頓迭代。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<complex>
#define ll long long
using namespace std;
template <typename T>
inline void _read(T& x){
char t=getchar();bool sign=true;
while(t<'0'||t>'9')
{if(t=='-')sign=false;t=getchar();}
for(x=0;t>='0'&&t<='9';t=getchar())x=x*10+t-'0';
if(!sign)x=-x;
}
const int p=998244353;
const int g=3;
int mont(int x,int y){
ll ANS=1;
for(x%=p;y;y>>=1,x=1LL*x*x%p){
if (y&1)ANS=1LL*ANS*x%p;
}
return int(ANS);
}
int fft_wi[300005];
void fft(int A[],int n,int ty){
int i,j,k,m,t0,t1;
for(i=0;i<n;i++){
for(j=0,k=i,m=1;m<n;m<<=1,j=(j<<1)|(k&1),k>>=1);
if(i<j)swap(A[i],A[j]);
}
fft_wi[0]=1;
for(m=1;m<n;m<<=1){
t0=mont(g,p-1+ty*(p-1)/(m<<1));
for(i=1;i<m;i++)fft_wi[i]=1LL*fft_wi[i-1]*t0%p;
for(k=0;k<n;k+=(m<<1)){
for(i=k;i<k+m;i++){
t0=A[i];
t1=1LL*A[i+m]*fft_wi[i-k]%p;
A[i]=t0+t1;if(A[i]>=p)A[i]-=p;
A[i+m]=t0-t1;if(A[i+m]<0)A[i+m]+=p;
}
}
}
if(ty==1)return;
t0=mont(n,p-2);
for(i=0;i<n;i++){
A[i]=1LL*A[i]*t0%p;
}
}
int d[300005],e[300005];
void multi(int A[],int B[],int C[],int la,int lb){
int i,j,k,t,N;
memset(d,0,sizeof(d));
memset(e,0,sizeof(e));
for(i=0;i<la;i++)d[i]=A[i];
for(i=0;i<lb;i++)e[i]=B[i];
N=1;
while(N<=(la+lb+1))N<<=1;
fft(d,N,1);
fft(e,N,1);
for(i=0;i<N;i++)d[i]=1ll*d[i]*e[i]%p;
fft(d,N,-1);
for(i=0;i<la+lb-1;i++)C[i]=d[i];
for(i=la+lb-1;i<N;i++)C[i]=0;
}
int inv_c[300005];
void inv(int A[],int B[],int la,int lb){
memset(inv_c,0,sizeof(inv_c));
int i,j,k,t,n,m;
B[0]=mont(A[0],p-2);
for(m=1;m<lb;m<<=1){
n=m<<1;
for(i=0;i<n;i++)inv_c[i]=A[i];
for(n<<=1;i<n;i++)inv_c[i]=0;
for(i=m;i<n;i++)B[i]=0;
fft(inv_c,n,1);
fft(B,n,1);
for(i=0;i<n;i++)inv_c[i]=p+2-1ll*inv_c[i]*B[i]%p;
for(i=0;i<n;i++)inv_c[i]=(inv_c[i]%p+p)%p;
for(i=0;i<n;i++)B[i]=1ll*B[i]*inv_c[i]%p;
fft(B,n,-1);
}
for(i=lb;i<n;i++)B[i]=0;
}
int ln_c[300005],ln_d[300005],ln_e[300005];
void ln(int A[],int B[],int la,int lb){
int i,j,k,t,n;
n=1;
while(n<la||n<lb)n<<=1;
memset(ln_c,0,sizeof(ln_c));
memset(ln_d,0,sizeof(ln_d));
memset(ln_e,0,sizeof(ln_e));
for(i=0;i<la;i++)ln_c[i]=A[i];
inv(ln_c,ln_d,la,n);
for(i=1;i<la;i++)ln_c[i-1]=1ll*A[i]*i%p;
for(i=la-1;i<n;i++)ln_c[i]=0;
multi(ln_d,ln_c,ln_e,n,la-1);
for(i=2,ln_c[1]=1;i<lb;i++)ln_c[i]=1ll*(p-p/i)*ln_c[p%i]%p;
for(i=1;i<lb;i++)B[i]=1ll*ln_e[i-1]*ln_c[i]%p;
B[0]=0;
for(i=lb;i<n;i++)B[i]=0;
}
int exp_c[300005],exp_d[300005];
void exp(int A[],int B[],int la,int lb){
int i,j,k,t,n,m;
for(m=1;m<lb;m<<=1){
n=(m<<1);
ln(B,exp_c,m,n);
exp_d[0]=1;
for(i=1;i<n;i++)exp_d[i]=0;
for(i=0;i<n;i++)exp_d[i]+=A[i];
for(i=0;i<n;i++)if(exp_d[i]>=p)exp_d[i]-=p;
for(i=0;i<n;i++)exp_d[i]-=exp_c[i];
for(i=0;i<n;i++)if(exp_d[i]<0)exp_d[i]+=p;
multi(B,exp_d,exp_c,m,n);
for(i=0;i<n;i++)B[i]=exp_c[i];
}
}
int poly_d[300005],poly_e[300005];
void poly_mont(int A[],int C[],ll num,int la,int lc){
int i,j,k,t,N,ld,le;
ln(A,poly_d,la,lc);
t=num%p;
for(i=0;i<lc;i++)poly_d[i]=1ll*poly_d[i]*t%p;
C[0]=mont(A[0],num%(p-1));
exp(poly_d,C,lc,lc);
}
int a[300005],b[300005];
int main(){
int i,j,la,lb;
ll k;
cin>>la;la++;
for(i=0;i<la;i++){
_read(a[i]);
}
cin>>k>>lb;
poly_mont(a,b,k,la,lb);
for(i=0;i<lb;i++){
printf("%d ",b[i]);
}
}
相關推薦
FFT多項式快速冪,對於x^num取模,順便再模一個998244353
多項式快速冪 時間限制 : 60000 MS 空間限制 : 524288 KB 問題描述: 給一個n次多項式,求它的k次方。沒關係,隨手模一個998244353就行了。沒關係,再隨手模一個xm就行了。 輸入格式: 第一行n,意義如上。 第二行n+
BZOJ3645: Maze(FFT多項式快速冪)
告訴 這樣的 typedef 小孩 tput 刪除 註意 一個 out Description 眾維拉先後在中土大陸上創造了精靈、人類以及矮人,其中矮人是生性喜好常年居住在地下的洞穴的存在,他們挖掘礦物甚至寶石,甚至用他們的勤勞勇敢智慧在地底下創造出了輝煌宏大的宮殿,
【BZOJ3992】[SDOI2015]序列統計 NTT+多項式快速冪
繼續 -m zoj 幫助 cst div sam [0 程序 【BZOJ3992】[SDOI2015]序列統計 Description 小C有一個集合S,裏面的元素都是小於M的非負整數。他用程序編寫了一個數列生成器,可以生成一個長度為N的數列,數列中的每個數都屬於集
快速排序,對於相同元素的優化,c++
#include<iostream>using namespace std; void middl(int &p,int &q,int &r)//找樞軸,然後把樞軸位置都換到第一位,左中右,取中值,放在左邊第一個 { if((p <= q && q &
[NTT 原根 指標 多項式快速冪] BZOJ 3992 [SDOI2015]序列統計
注意到,M 是質數 乘法取個log變加法 也就是取指標 於是對於1 ~M−1 中的每一個數都可以表示成原根的某次冪。 於是乘法可以轉化為原根的冪的加法, 轉移的時候就相當於做多項式乘法了 然後快速冪 又是道數論好題 #include<cstdio> #inc
快速用JavaScript實現劃詞取詞,可複製百度文庫文字(獲取滑鼠選中區域文字)
完整程式碼可在最後程式碼塊檢視呦!!! ※本貼程式碼,可用用於油猴指令碼,支援瀏覽器F12Console控制檯直接執行 有一段時間呢在百度文庫查詢資料時被限制了複製,說什麼複製次數已達上限,那個 難受鴨!!於是我打開了傳說中的F12,意外的發現了一個功能 就是很意外的發現我所選中的文字會在
PyCharm的常用功能介紹,對於我菜鳥來說,這點功能暫時夠用了
1. 設定行號 在安裝PyCharm後,在程式碼編輯介面中是預設顯示行號的。但是有的讀者的PyCharm不現實行號,此時可以依次單擊File>Settings>Editor>General>Appearance, 在彈出的“Appearance”介面中勾選“Show
座標軸上的兩個字母 X 和 m, 希望X 是斜體,m是正體
同一個座標軸上的兩個字母 X 和 m, 希望X 是斜體,m是正體。 在MATLAB中,該如何實現X 是斜體,m是正體。 figure, xlabel('\itX, \rmm') 如果要設定xlabel('\itX, \rmm')裡面的x,
整數劃分如,對於正整數n=6,可以分劃為:6 5+1
import java.util.Scanner; public class IntHuafen { /* 整數劃分 如,對於正整數n=6,可以分劃為: 6 5+1 4+2, 4+1+1 3+
Mysql批量寫入資料,對於這類效能問題,你是如何優化的
測試環境 配置直接影響執行速度,先上一下測試機配置: cpu i7 5500U(低電壓傷不起,以後再也不買低電壓的U了) 記憶體 8G ddr3 1600 php 7.1 mysql 5.5.40 開發框架 CodeIgniter 3.1.2 影響寫入效率的因素
51nod 1113 矩陣連乘快速冪模板 (對100000007取模)
#include<cstdio> #include<cmath> #include<algorithm> #define ll long long #define M 1000000007 using namespace std; c
繞過ROBOTS規則,轉向頁面抓取配置,內容大小限制
1. 如何繞過目標站點的robots.txt限制 多數站點都是隻允許百度、google等搜尋引擎抓取的,所以會在robots.txt裡限制其他爬蟲。 nutch自然是會遵循robots協議的,但是我們可以通過修改nutch原始碼來繞過限制。 相關程式碼位於(nutch版本1
C語言:猴子吃桃,每天吃現有桃子的一半然後再吃一個,到第10天的時候剩下了1個桃子,問第一天摘了多少桃子。
猴子吃桃,每天吃現有桃子的一半然後再吃一個,到第10天的時候剩下了1個桃子,問第一天摘了多少桃子。#include<stdio.h>main(){int day=1,sun=1;while(day<10){sun=(sun+1)*2;day++;}print
2017省夏令營Day7 【快速冪,篩法,矩陣快速冪,線段樹】
swap 暴力 == define 練習 矩陣快速冪 color amp fine 題解:首先,我們可以得到一個規律:經過2次變換後,a和b的值都分別乘2了,所以只要用快速冪就能過啦,但是,要特判n為0的情況。 代碼如下: 1 #include<cstdi
UVa 11149 Power of Matrix (矩陣快速冪,倍增法或構造矩陣)
分解 ack 題意 技術 cstring set sizeof lib cto 題意:求A + A^2 + A^3 + ... + A^m。 析:主要是兩種方式,第一種是倍增法,把A + A^2 + A^3 + ... + A^m,拆成兩部分,一部分是(E + A^(m/2
快速冪取模(當數很大時,相乘long long也會超出的解決辦法)
結合 超出 但是 long 數字 也會 連續 return result 當幾個數連續乘最後取模時,可以將每個數字先取模,最後再取模,即%對於*具有結合律。但是如果當用來取模的數本身就很大,采取上述方法就不行了。這個時候可以借鑒快速冪取模的方法,來達到大數相乘取模的效果。
【codeforces 623E】dp+FFT+快速冪
chang CI name mod memset 技巧 IV bits 嚴格 題目大意:用$[1,2^k-1]$之間的證書構造一個長度為$n$的序列$a_i$,令$b_i=a_1\ or\ a_2\ or\ ...\ or a_i$,問使得b序列嚴格遞增的方案數,答案對$1
【BZOJ1898】[ZJOI2005]沼澤鱷魚(矩陣快速冪,動態規劃)
表示 ear 構建 esp ++ 方案 set 沒有 ring 【BZOJ1898】[ZJOI2005]沼澤鱷魚(矩陣快速冪,動態規劃) 題面 BZOJ 洛谷 題解 先吐槽,說好了的鱷魚呢,題面裏面全是食人魚 看到數據範圍一眼想到矩乘。 先不考慮食人魚的問題,直接設\(f[
【HDOJ5950】Recursive sequence(矩陣乘法,快速冪)
重點 模板 || getchar() 矩陣 col space pair color 題意:f[1]=a,f[2]=b,f[i]=2f[i-2]+f[i-1]+i^4(i>=3),多組詢問求f[n]對2147493647取模 N,a,b < 2^31 思路:重點
【FZU - 1759】Super A^B mod C (數論,快速冪,快速乘,尤拉降冪,指數迴圈節,模板)
題幹: Given A,B,C, You should quickly calculate the result of A^B mod C. (1<=A,C<=1000000000,1<=B<=10^1000000). Input There are mult