BZOJ 4818 Sdoi2017 序列計數

2022-04-30 04:24:09 字數 979 閱讀 8972

bzoj_4818_[sdoi2017]序列計數_矩陣乘法

alice想要得到乙個長度為n的序列,序列中的數都是不超過m的正整數,而且這n個數的和是p的倍數。alice還希望

,這n個數中,至少有乙個數是質數。alice想知道,有多少個序列滿足她的要求。

一行三個數,n,m,p。

1<=n<=10^9,1<=m<=2×10^7,1<=p<=100

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

3 5 3

33求至少有乙個質數的方案可以用總方案減去不含質數的方案。

先把1~m的質數篩出來,觀察p特別小,考慮每個數%p的值對答案的貢獻。

設f[i][j]表示從%p=i到%p=j的方案數,這個矩陣乘1次相當於向序列裡多塞了個數,於是這道題變成了矩陣乘法。

然後發現f[i][j]=f[i+1][j+1],因此只需要對每個1~m中的i,f[0][i%p]++即可,剩下的可以通過平移得到。

**:

#include #include #include using namespace std;

typedef long long ll;

ll mod=20170408;

int n,m,p,prime[7000050],cnt;

bool vis[20000050];

struct mat

mat operator*(const mat a) const

}a,b;

mat pow(mat x,int y)

return i;

}void init()

for(j=1;j<=cnt&&i*prime[j]<=m;j++)

}}int main()

for(i=p-1;i;i--)

}printf("%lld\n",(pow(a,n).v[p][p]-pow(b,n).v[p][p]+mod)%mod);

}

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

BZOJ4818 SDOI2017 序列計數

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

4818 Sdoi2017 序列計數

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