BZOJ4818 SDOI2017 序列計數

2022-04-28 20:33:18 字數 1027 閱讀 2855

bzoj

luogu

alice想要得到乙個長度為\(n\)的序列,序列中的數都是不超過\(m\)的正整數,而且這\(n\)個數的和是\(p\)的倍數。alice還希望,這\(n\)個數中,至少有乙個數是質數。alice想知道,有多少個序列滿足她的要求。

一行三個數,\(n,m,p\)。

\(1\le n\le 10^9,1\le m\le 2*10^7,1\le p\le 100\)

一行乙個數,滿足alice的要求的序列數量,答案對\(20170408\)取模。

3 5 3

這算是\(sdoi\)簽到題?

首先至少有乙個質數的方案數=總方案數-乙個質數都沒有的方案數。

所以篩出\(m\)以內的質數做兩遍就好了。

注意到原\(dp\)式是乙個卷積的形式,所以可以\(o(p^2)\)直接計算(你要寫\(mtt\)沒人攔你)

所以就做完了,複雜度\(o(m+p^2\log n)\)

#include#include#includeusing namespace std;

const int n = 2e7+5;

const int mod = 20170408;

const int p = 105;

bool zhi[n];

int pri[n],tot,n,m,p,f[p],g[p],ans;

void mul(int *a,int *b)

int main()

} for (int i=1;i<=m;++i) ++g[i%p];

f[0]=1;ans=fastpow(f,g,n);

memset(f,0,sizeof(f));memset(g,0,sizeof(g));

for (int i=1;i<=m;++i) if (zhi[i]) ++g[i%p];

f[0]=1;ans=(ans-fastpow(f,g,n)+mod)%mod;

printf("%d\n",ans);return 0;

}

bzoj4818 SDOI2017 序列計數

題目鏈結 先考慮暴力 dp f i j 表示前 i 個數,數字之和模 p 餘 j 的方案數。我們先不考慮必須有質數這個條件,先統計出全部方案。然後再減去沒有質數的方案就行了。那麼就有 f i 1 j k p f i j 1 le k le m 然後發現這個其實並不需要 o m 的轉移,因為 j k ...

BZOJ 4818 Sdoi2017 序列計數

bzoj 4818 sdoi2017 序列計數 矩陣乘法 alice想要得到乙個長度為n的序列,序列中的數都是不超過m的正整數,而且這n個數的和是p的倍數。alice還希望 這n個數中,至少有乙個數是質數。alice想知道,有多少個序列滿足她的要求。一行三個數,n,m,p。1 n 10 9,1 m ...

4818 Sdoi2017 序列計數

4818 sdoi2017 序列計數 time limit 30 sec memory limit 128 mb submit 396 solved 267 submit status discuss description alice想要得到乙個長度為n的序列,序列中的數都是不超過m的正整數,而且...