日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Bzoj4818--Sdoi2017序列计数

發布時間:2024/8/26 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Bzoj4818--Sdoi2017序列计数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Description

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

Input

一行三個數,n,m,p。 1<=n<=10^9,1<=m<=2×10^7,1<=p<=100

Output

一行一個數,滿足Alice的要求的序列數量,答案對20170408取模。 ---------------------------------------------------------------此后一千里------------------------------------------------------------------------- 題解 : 你問這題難不難?我就明確告訴你,不難。你問那我為什么要寫題解?我就明確告訴你,因為我傻叉去寫了矩陣快素冪。 ---ihopenot 題解基本已經在前面的引言里了。算出所有合法方案減去沒有質數的方案。 然后我就隨手一發矩陣快速冪。。。快速冪。。。冪。。。 然而這題用倍增去做每次只用p^2乘起來就可以了。復雜度直接少個p。。。 雖然矩陣也能過。 代碼 :(bzoj 18s) //That's right ,I am killer . #include<bits/stdc++.h> #define LL long long #define eps 1e-9 #define INF 0x3f3f3f3f using namespace std;#define int int inline int Max(int a,int b) {return a>b?a:b;} inline int Min(int a,int b) {return a<b?a:b;} inline int Sqr(int a) {return a*a;} inline int Abs(int a) {return a>0?a:-a;} #undef int#define MAXN 20000007 #define MOD 20170408int n,m,p;struct Matrix{int x[105][105];void Init() {memset(x,0,sizeof(x));}void Out() {for(int i=0;i<p;i++) {for(int j=0;j<p;j++) cout<<x[i][j]<<" ";cout<<endl;}}Matrix operator * (const Matrix &b) const {Matrix ret;ret.Init();for(int i=0;i<p;i++) for(int j=0;j<p;j++)for(int k=0;k<p;k++) ret.x[i][k]=(ret.x[i][k]+(LL) x[i][j]*b.x[j][k])%MOD;return ret;} }st,tra[2],e;Matrix Fpow(Matrix a,int p) {Matrix ret=e,tmp=a;while(p) {if(p&1) ret=ret*tmp;tmp=tmp*tmp; p>>=1;}return ret; }int pri[MAXN],cnt;bool mk[MAXN]; int ap[2][105]; void Pre() { st.x[0][0]=1;for(int i=0;i<p;i++) e.x[i][i]=1;mk[1]=1;for(int i=2;i<=m;i++) {if(!mk[i]) pri[++cnt]=i;for(int j=1;j<=cnt&&i*pri[j]<=m;j++) {mk[i*pri[j]]=1;if(i%pri[j]==0) break;}}for(int i=1;i<=m;i++) {ap[0][i%p]++;ap[1][i%p]+=mk[i] ? 1:0;}for(int k=0;k<p;k++) for(int i=0;i<p;i++) {tra[0].x[(i+k)%p][i]+=ap[0][k];tra[1].x[(i+k)%p][i]+=ap[1][k];} }int ans;int main() {scanf("%d%d%d",&n,&m,&p);Pre();tra[0]=Fpow(tra[0],n)*st;tra[1]=Fpow(tra[1],n)*st;ans=tra[0].x[0][0]-tra[1].x[0][0];ans=(ans+MOD)%MOD;printf("%d\n",ans);return 0; } View Code

?

轉載于:https://www.cnblogs.com/ihopenot/p/6707542.html

總結

以上是生活随笔為你收集整理的Bzoj4818--Sdoi2017序列计数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。