SDOI2015 序列統計

2021-08-16 02:35:25 字數 1507 閱讀 7812

time limit: 30 sec  

memory limit: 128 mb

submit: 1829  

solved: 870 [

submit][

status][

discuss]

小c有乙個集合s,裡面的元素都是小於m的非負整數。他用程式編寫了乙個數列生成器,可以生成乙個長度為n的數

列,數列中的每個數都屬於集合s。小c用這個生成器生成了許多這樣的數列。但是小c有乙個問題需要你的幫助:

給定整數x,求所有可以生成出的,且滿足數列中所有數的乘積mod m的值等於x的不同的數列的有多少個。小c認為

,兩個數列和不同,當且僅當至少存在乙個整數i,滿足ai≠bi。另外,小c認為這個問題的答案可能很大

,因此他只需要你幫助他求出答案mod 1004535809的值就可以了。

一行,四個整數,n、m、x、|s|,其中|s|為集合s中元素個數。

第二行,|s|個整數,表示集合s中的所有元素。

1<=n<=10^9,3<=m<=8000,m為質數

0<=x<=m-1,輸入資料保證集合s中元素不重複

一行,乙個整數,表示你求出的種類數mod 1004535809的值。

4 3 1 2

1 28

【樣例說明】

可以生成的滿足要求的不同的數列有(1,1,1,1)、(1,1,2,2)、(1,2,1,2)、(1,2,2,1)、

(2,1,1,2)、(2,1,2,1)、(2,2,1,1)、(2,2,2,2)

round 1 感謝yts1999上傳

[ submit][

status][

discuss]

fft優化板子題,還有鬼畜的快速冪轉移dp,更鬼畜的是我居然都1a了!

accode

#include#include#include#include#define maxn 40005

using namespace std;

int n,m,s,x,len;

int b[maxn],f[maxn],map[maxn];

int p=1004535809,g,invg,wn[2][22];

int pow(int base,int k,int p)

bool check(int num,int p)

void prework()

invg=pow(g,p-2,p);

for(int i=1;i<=21;i++) wn[1][i]=pow(g,(p-1)/(1<>1;k;k>>=1) if((j^=k)>=k) break; }

for(int i=1,j,k,w,x,y,len;1<>=1,mul(base,base,base,len)) if(k&1) mul(ret,ret,base,len);

}int main()

pow(ans,b,n,len);

printf("%d\n",(ans[map[x]]+p)%p);

}

SDOI2015 序列統計

description 小c有乙個集合s,裡面的元素都是小於m的非負整數。他用程式編寫了乙個數列生成器,可以生成乙個長度為n的數列,數列中的每個數都屬於集合s。小c用這個生成器生成了許多這樣的數列。但是小c有乙個問題需要你的幫助 給定整數x,求所有可以生成出的,且滿足數列中所有數的乘積mod m的值...

SDOI2015 序列統計

點此看題 第一次寫ntt text ntt,被搞自閉了。0x01 樸素dp 設f i j f i j f i j 為選i ii個數乘積為j jj的方案數,轉移如下 f 2 i j f i k f i j inv k f 2i j f i k times f i j times inv k f 2i ...

SDOI 2015 序列統計

在遭受了巨大的精神打擊後,我決定了,要做乙個壓行的好孩子!部落格如果有不對之處,請一定要指出啊啊啊啊啊謝謝謝謝謝大佬!我們首先可以寫出乙個遞推式 f a c b d取 模mod f a b f c d f a c b d取模mod f a b f c d f a c b d 取模mo d f a b...