SDOI2015 序列統計

2021-09-24 18:42:38 字數 2116 閱讀 8563

description

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

小c用這個生成器生成了許多這樣的數列。但是小c有乙個問題需要你的幫助:給定整數x,求所有可以生成出的,且滿足數列中所有數的乘積mod m的值等於x的不同的數列的有多少個。小c認為,兩個數列和不同,當且僅當至少存在乙個整數i,滿足ai≠bi。另外,小c認為這個問題的答案可能很大,因此他只需要你幫助他求出答案mod 1004535809的值就可以了。

input

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

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

output

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

sample input

4 3 1 2

1 2

sample output

8

【樣例說明】

可以生成的滿足要求的不同的數列有(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)。

data constraint

對於10%的資料,1<=n<=1000;

對於30%的資料,3<=m<=100;

對於60%的資料,3<=m<=800;

對於全部的資料,1<=n<=109,3<=m<=8000,m為質數,1<=x<=m-1,輸入資料保證集合s中元素不重複。

解法:首先可以想到乙個暴力dp,設f[i][j]表示選到第i個數,mod m=j的方案數。那麼顯然轉移方程為f[i+1][j*k%m]+=f[i][j];

即f[i+1][j*k%m]=∑f[i][j]*num[k](序列s中mod m=k的數的個數)

因為m是質數,所以m存在原根,我們可以通過離散對數的變換將乘法變為加法

原式變為f[i+1][(ind[j]+ind[k])%(m-1)]=∑f[i][ind[j]]*num[ind[k]]

為卷積形式,可使用fft優化。

n很大,所以套乙個快速冪即可

#include#include

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;int

n,m,x,l,i,k,n,ws,nn;

int a[100011],pos[100011],b[100011],b[100011],d[100011

];int w[100011],ind[100011],h[100011

];int mo=1004535809

;int mi(int x,int

z)

returnl;}

bool isroot(int

x)

return

true;}

void

prepare()

l=1;

for(i=1;i)

//fftn次單位複數根

n=1;

while(n<2*m)

w[0]=1

; w[

1]=mi(3,(mo-1)/n);

for(i=2;i<=n;i++)w[i]=(ll)w[i-1]*w[1]%mo;

for(i=0;i)

}nn=mi(n,mo-2);}

void dft(int *a,int

sig)}}

for(i=0;ih[i];

}void fft(int *a,int *b)

}void mt(int *b,int

z) z/=2

;

for(i=0;ib[i];

fft(b,b);

}}void

work()

intmain()

b[0]=0

; work();

}

SDOI2015 序列統計

time limit 30 sec memory limit 128 mb submit 1829 solved 870 submit status discuss 小c有乙個集合s,裡面的元素都是小於m的非負整數。他用程式編寫了乙個數列生成器,可以生成乙個長度為n的數 列,數列中的每個數都屬於集合...

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...