[BZOJ3992]序列統計

DP一下,設$f_{i,j}$表示生成$i$個數且乘積$\%M=j$的方案數,則$f_{i+1,l}=\sum\limits_{jk\%M=l}[k\in S]f_{i,j}$

我們很不希望DP式中下標的位置出現乘法,因為這樣不好轉移,考慮把乘法換成加法

因為模數$M$是質數,所以它有原根,于是對于每個$1\leq x\leq M-1$都有唯一的$0\leq x'\leq M-2$使得$x=g^{x'}$,所以DP式可以寫成$f_{i+1,g^{l'}}=\sum\limits_{g^{j'+k'}\%M=g^{l'}}[g^{k'}\in S]f_{i,g^{j'}}$,令$h_{i,j}=f_{i,g^j},S'=\{x|g^x\in S,0\leq x\leq M-2\}$,則$h_{i+1,l}=\sum_{(j+k)\%(M-1)=l}\limits[k\in S']h_{i,j}$,這是卷積的形式($j+k\geq M-1$的項最后加到低次的項中),所以我們可以用FFT做到在$O(n\log_2n)$的時間內從$h_i$轉移到$h_{i+1}$

$n$很大,但是每次轉移都是一樣的,所以只需要快速冪就好了,總時間復雜度$O(M\log_2M\log_2n)$

注意題目給的$S$中是有可能出現$0$的,忽略就好

#include<stdio.h>
#include<string.h>
const int mod=1004535809;
typedef long long ll;
int mul(int a,int b,int p=mod){return a*(ll)b%p;}
int ad(int a,int b){return(a+b)%mod;}
int de(int a,int b){return(a-b)%mod;}
void swap(int&a,int&b){a^=b^=a^=b;}
int rev[40010],N,iN,m;
int pow(int a,int b){int s=1;while(b){if(b&1)s=mul(s,a);a=mul(a,a);b>>=1;}return s;
}
void pre(int n){int i,k;for(N=1,k=0;N<n;N<<=1)k++;for(i=0;i<N;i++)rev[i]=(rev[i>>1]>>1)|((i&1)<<(k-1));iN=pow(N,mod-2);
}
void ntt(int*a,int on){int i,j,k,t,w,wn;for(i=0;i<N;i++){if(i<rev[i])swap(a[i],a[rev[i]]);}for(i=2;i<=N;i<<=1){wn=pow(3,(on==1)?(mod-1)/i:(mod-1-(mod-1)/i));for(j=0;j<N;j+=i){w=1;for(k=0;k<i>>1;k++){t=mul(w,a[i/2+j+k]);a[i/2+j+k]=de(a[j+k],t);a[j+k]=ad(a[j+k],t);w=mul(w,wn);}}}if(on==-1){for(i=0;i<N;i++)a[i]=mul(a[i],iN);}
}
struct poly{int n,a[40010];poly(){n=0;memset(a,0,sizeof(a));}
};
poly operator*(poly x,poly y){int i;poly c;pre(x.n+y.n+1);ntt(x.a,1);ntt(y.a,1);for(i=0;i<N;i++)c.a[i]=mul(x.a[i],y.a[i]);ntt(c.a,-1);for(i=m-1;i<N;i++){c.a[i%(m-1)]=ad(c.a[i%(m-1)],c.a[i]);c.a[i]=0;}c.n=m-2;return c;
}
int getg(int p){int i,j,t;for(i=2;i<p;i++){t=1;for(j=1;j<p-1;j++){t=mul(t,i,p);if(t==1)break;}if(j==p-1)break;}return i;
}
int s[8010],r[8010];
poly pow(poly a,int b){poly s;s.a[0]=1;while(b){if(b&1)s=s*a;a=a*a;b>>=1;}return s;
}
int main(){int n,x,ss,i,g,b;poly a;scanf("%d%d%d%d",&n,&m,&x,&ss);for(i=1;i<=ss;i++)scanf("%d",s+i);g=getg(m);b=1;for(i=0;i<m-1;i++){r[b]=i;b=mul(b,g,m);}for(i=1;i<=ss;i++){if(s[i])a.a[r[s[i]]]=1;}a.n=m-2;while(a.a[a.n]==0)a.n--;a=pow(a,n);printf("%d",(a.a[r[x]]+mod)%mod);
}

轉載于:https://www.cnblogs.com/jefflyy/p/8717294.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/254981.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254981.shtml
英文地址,請注明出處:http://en.pswp.cn/news/254981.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

socket,TCP/IP的理解(轉)

TCP/IP 要想理解socket首先得熟悉一下TCP/IP協議族&#xff0c; TCP/IP&#xff08;Transmission Control Protocol/Internet Protocol&#xff09;即傳輸控制協議/網間協議&#xff0c;定義了主機如何連入因特網及數據如何再它們之間傳輸的標準&#xff0c; 從字面意思來看TCP…

最小中間和

題目描述 給定一個正整數序列a1,a2,...,an&#xff0c;不改變序列中的每個元素在序列中的位置&#xff0c;把它們相加&#xff0c;并用括號記每次加法所得的和&#xff0c;稱為中間和。編程&#xff1a;找到一種方法&#xff0c;添上n-1對括號&#xff0c;加法運算依括號順序進…

HALCON示例程序measure_metal_part_extended.hdev金屬零件尺寸測量

HALCON示例程序measure_metal_part_extended.hdev金屬零件尺寸測量 示例程序源碼&#xff08;加注釋&#xff09; 關于顯示類函數解釋 dev_update_off () read_image (Image, ‘metal-parts/metal-parts-01’) init_visualization (Image, 3, ‘white’, ‘margin’, Width, …

雙目匹配與視差計算

立體匹配主要是通過找出每對圖像間的對應關系&#xff0c;根據三角測量原理&#xff0c;得到視差圖&#xff1b;在獲得了視差信息后&#xff0c;根據投影模型很容易地可以得到原始圖像的深度信息和三維信息。立體匹配技術被普遍認為是立體視覺中最困難也是最關鍵的問題&#xf…

JavaEE 銀聯支付之網站支付-消費類交易

以銀聯網站支付 - 消費類交易 為例 0. 大致邏輯 前端request->后臺封裝參數->后臺進行簽名->生成跳轉頁面&#xff08;包含表單提交內容&#xff09;->響應前端&#xff08;將生成的html寫到瀏覽器中完成自動跳轉打開銀聯支付頁面&#xff09; 復制代碼1.acp_sdk.p…

react 開發知識準備

react react使用教程 babel babel 可用于ES6轉換為ES5&#xff0c;jsx轉換為原生js。 ES6 ES6 語法 webpack webpack打包工具&#xff0c;它把不同的、相互依賴的靜態資源都視作模塊&#xff0c;并且打包成我們想要的靜態資源。讓代碼組織更清晰&#xff0c;一個文件就是一個模…

Linux多線程編程(不限Linux)

——本文一個例子展開&#xff0c;介紹Linux下面線程的操作、多線程的同步和互斥。 前言 線程&#xff1f;為什么有了進程還需要線程呢&#xff0c;他們有什么區別&#xff1f;使用線程有什么優勢呢&#xff1f;還有多線程編程的一些細節問題&#xff0c;如線程之間怎樣同步、…

概率論與數理統計-ch8-假設檢驗

1、假設檢驗 在總體的分布函數未知或只知其形式、不知其參數的情況下&#xff0c;為了推斷總體的某些未知特性&#xff0c;提出關于總體的假設&#xff0c;然后根據樣本數據對提出的假設做出接受或拒絕的決策。 步驟&#xff1a; 提出原假設--確定建立在樣本基礎上的檢驗統計量…

HALCON示例程序measure_metal_part_first_example.hdev通過擬合邊緣進行尺寸測量

HALCON示例程序measure_metal_part_first_example.hdev通過擬合邊緣進行尺寸測量 示例程序源碼&#xff08;加注釋&#xff09; 關于顯示類函數解釋 dev_update_off () read_image (Image, ‘metal-parts/metal-parts-01’) get_image_size (Image, Width, Height) dev_close…

簡單實現仿某寶地址選擇三級聯動樣式

內容簡單介紹實現步驟第一步 找準方向第二步 開干總結還是題外話內容簡單介紹 簡單看一下須要實現的效果&#xff0c;如圖&#xff1a; 實現步驟 第一步 找準方向 事實上就是想好要用recyclerview而不是listview。假設要問我recyclerview是什么的話。。 第二步 開干 首先須要先…

opencv雙目測距實現

雖然最近注意力已經不可遏制地被神經科學、大腦記憶機制和各種畢業活動吸引過去了&#xff0c;但是還是覺得有必要把這段時間雙目視覺方面的進展總結一下。畢竟從上一篇博文發表之后&#xff0c;很多同仁發E-mail來與我討論&#xff0c;很多原來的疑團&#xff0c;也在討論和一…

logback高級特性使用-異步記錄日志

注意&#xff1a;該功能需要高版本才能支持&#xff0c;如1.0.11。AsyncAppender&#xff0c;異步記錄日志。 工作原理&#xff1a; 當Logging Event進入AsyncAppender后&#xff0c;AsyncAppender會調用appender方法&#xff0c;append方法中在將event填入Buffer(這里選用的數…

Linux下c開發 之 線程通信(轉)

1.Linux“線程”進程與線程之間是有區別的&#xff0c;不過Linux內核只提供了輕量進程的支持&#xff0c;未實現線程模型。Linux是一種“多進程單線程”的操作系統。Linux本身只有進程的概念&#xff0c;而其所謂的“線程”本質上在內核里仍然是進程。大家知道&#xff0c;進程…

HDU 1028 Ignatius and the Princess III

//強行遞推。 xx[i][j]表示i數中第j個開頭的組合種類。 /* 最終結果[i]為 sum of(xx[i][j]) (j from 1 to i); xx[i][j]sum of (xx[i-j][k]) (k from 1 to j); 例如 xx[10][4]xx[6][1]xx[6][2]xx[6][3]xx[6][4]; xx[6][1] 1; 6111111; xx[6][2]3; 6222, 62211, 621111; xx[…

HALCON示例程序measure_metal_part_id.hdev使用xld邊緣擬合檢測零件加工是否合格

HALCON示例程序measure_metal_part_id.hdev使用xld邊緣擬合檢測零件加工是否合格 示例程序源碼&#xff08;加注釋&#xff09; 關于顯示類函數解釋 dev_update_off () Imagefiles : [‘metal-parts/metal-part-model-01’,‘metal-parts/metal-parts-01’,‘metal-parts/meta…

編寫批處理文件-------基礎

第一、Windows bat 批處理文件 編寫 如何編寫批處理文件 批處理文件&#xff08;batch file&#xff09;包含一系列 DOS命令&#xff0c;通常用于自動執行重復性任務。 用戶只需雙擊批處理文件便可執行任務&#xff0c;而無需重復輸入相同指令。編寫批處理文件非常簡單&#xf…

主控芯片

主控芯片&#xff1a; 主控芯片里有310&#xff0c;320,3288&#xff0c;288,318&#xff0c;333&#xff0c;345&#xff0c;7501, 其中310是中星微發展比較早&#xff0c;比較成熟的芯片。在現在一般應用在水晶夾子之類的低端產品上。 3288也是低端芯片&#xff0c;318&…

MPEG2、H.263、H.264協議效率對比

[摘錄]1.1 MPEG2、H.263、H.264協議效率對比ITUT中定義的雙向視頻通信協議族包括&#xff1a;H.320、H.323&#xff0c;這兩個協議族中&#xff0c;包含了很多子協議&#xff0c;例如音頻編碼協議、視頻編碼協議等&#xff0c;其中視頻編碼包括&#xff1a;H.261、H.263、H.264…

WebService SOAP、Restful和HTTP(post/get)請求區別

web service&#xff08;SOAP&#xff09; Webservice的一個最基本的目的就是提供在各個不同平臺的不同應用系統的協同工作能力。 Web service 就是一個應用程序&#xff0c;它向外界暴露出一個能夠通過Web進行調用的API。 SOAP是一種簡單基于xml的輕量協議&#xff0c;用戶web…

Block的循環引用詳解

1.首先我們創建了一個網絡請求工具類 然后storyboard里面去創建了一個導航控制器 并且把它設置為初始控制器 然后拖入一個bar button &#xff0d;&#xff0d;show&#xff0d;&#xff0d;到自帶的控制器 這個時候運行代碼的結果是 x 顯然這個時候沒有造成循環引用 為什…