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的正整數,而且...