bzoj3992 NTT 序列統計

2021-08-18 06:35:04 字數 2186 閱讀 5343

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中的所有元素。

1<=n<=10^9,3<=m<=8000,m為質數 0<=x<=m-1,輸入資料保證集合s中元素不重複x∈[1,m-1]

集合中的數∈[0,m-1]

output

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

sample input

4 3 1 2

1 2

sample output

hint

【樣例說明】

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

題解

ntt入門題

首先求出m的原根g,那麼1~m-1的所有數都可用g的次冪形式表示出 譬如x

=gi x=g

i,y

=gj y=g

j,對於x∗yx∗

y,就相當於gi+jg

i+

j了 那麼對於兩數相乘等於次數相加的情況,可以想到我們可以對輸入的s構造生成函式f

構造生成函式後求這個函式的n次冪,由於乙個數可以反覆取,所以無需容斥去重

求n次冪的時候,我們會發現,兩個次數為m的多項式相乘時,次數會**至2*m。這時候我們可以暴力把後m~2*m這一段給加到前面來,因為是取模的嘛

取模一定要勤快呀說不定**就爆longlong了

#include

#include

#include

#include

#include

using namespace std;

typedef long long ll;

const int maxn=21000;

struct node

a,ans;

const ll mod=1004535809;

int r[21000],l,n,m,x,s;

ll pow_mod(ll a,int b,ll mod)

return ans;

}void ntt(ll *y,int len,int op)}}

if(op==-1)

}ll b[maxn],p[maxn];

int len;

void mul(ll *ret,node x,node y,int len)

void sol()

}int get_root(ints);

for(int i=2;iif((s-1)%i==0)q[++q[0]]=i;

for(int i=2;;i++)

if(bk==true)return i;

}return -1;

}int main()

for(int i=1;i<=s;i++)if(b[i])a.m[p[b[i]]]=1;

l=0;

for(len=1;len<=m*2;len<<=1)l++;

for(int i=1;i>1]>>1)|(i&1)<<(l-1);

ans.m[0]=1;

sol();

printf("%lld\n",ans.m[p[x]]);

return

0;}

bzoj3992 SDOI2015 序列統計

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

bzoj3992 SDOI2015 序列統計

不好做不好做,真心不好做。這個題顯然是dp,一開始我們這樣設計狀態f i j 表示長度為i的序列,積在模 m 意義下等於 j的數列的方案數。那顯然直接做的複雜度是o nm2 到了這裡,有一種矩陣快速冪做法,可以直接優化到o nm3 應該能過30 顯然正解不允許帶有o m3 所以矩陣肯定是不行了。到這...

bzoj3992 SDOI2015 序列統計

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