3992 SDOI2015 序列統計

2021-07-26 12:20:43 字數 2635 閱讀 7846

time limit: 30 sec  

memory limit: 128 mb

submit: 990  

solved: 452 [

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

一行,乙個整數,表示你求出的種類數

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)。

【資料規模和約定】

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

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

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

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

round 1 感謝yts1999上傳 [

submit][

status][

discuss]

求出m的原根g,定義fi,j:長度為i的序列%m == g^j的方案數

這樣就能隨意構造成卷積的形式了,ntt + 快速冪即可解決

一般情況下,乙個數的原根並不大,可以直接列舉得出

這裡提供一種較優秀的做法,對於乙個質數m(m > 2),令m = m - 1

對m質因數分解,假設共n個質數,第i個質數為pi

g是m的原根,當且僅當

#include#include#include#includeusing namespace std;

const int maxn = 17000;

typedef long long ll;

const ll p = 1004535809ll;

int mul(const ll &x,const ll &y,const ll &mo)

int add(const int &x,const int &y,const int &mo)

int dec(const int &x,const int &y,const int &mo)

int n,m,x,tot,k,s,n,m,g,inv,pri[maxn],pos[maxn],a[maxn],w[maxn],_w[maxn],f[maxn],g[maxn],h[maxn],b[maxn];

bool not_pri[maxn];

vector v;

int ksm(int x,int y,int mo)

return ret;}

bool judge(int k)

void rader(int *f)}

void ntt(int *f,int *w,int on)

}if (on == -1) for (int i = 0; i < n; i++) f[i] = mul(f[i],inv,p);}

void work(int *f,int *g)

int main()

}m = m - 1;

for (int i = 1; i <= tot; i++)

m = m - 1;

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

if (judge(i))

int now = 1;

for (int i = 1; i < m; i++)

now = mul(now,g,m),pos[now] = i;

w[0] = 1; w[1] = ksm(3,(p - 1) / n,p);

for (int i = 2; i <= n; i++) w[i] = mul(w[i-1],w[1],p);

for (int i = 0; i <= n; i++) _w[i] = w[n - i];

for (int i = 1; i <= s; i++) if (a[i]) g[pos[a[i]]] = 1; f[0] = 1;

for (; n; n >>= 1)

cout << f[pos[x]] << endl;

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的不同的數列的有多...