小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中元素不重複x∈[1,m-1]
集合中的數∈[0,m-1]
一行,乙個整數,表示你求出的種類數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)
原根的一類性質:設\(p\)為\(mod\)的原根,那麼\(p^0\to p^ \pmod\)可以表示出1~mod-1的所有數。
這樣我們就可以對於每個數求指標(\(p^x=y\),其中\(x\)為\(y\)的指標),然後我們就可以把乘法變成指數上的加法,ntt多項式快速冪即可。
#include#include#include#includeusing namespace std;
#define ll long long
#define g 3
#define mod 1004535809ll
inline ll read()
const ll maxn = 100010;
const ll inf = 2147473600;
ll n,m,x,s; ll top,rev[maxn+1];
ll s[maxn+1],sta[maxn+1];
ll a[maxn+1];
inline ll pow(ll a,ll b,ll p) return res;
} inline ll getn(ll x)
for(ll i=2;;i++)
if(flag) return i;
}}ll a1[maxn+1],b1[maxn+1],c1[maxn+1],b[maxn+1],t[maxn+1];
inline void ntt(ll *a,ll lim,ll type) return ;}
int main() printf("%lld\n",b[t[x]]%mod);
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的不同的數列的有多...