BZOJ2326 [HNOI2011]数学作业 【矩阵快速幂】
生活随笔
收集整理的這篇文章主要介紹了
BZOJ2326 [HNOI2011]数学作业 【矩阵快速幂】
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題解
我們設f[i]表示前i個數(shù)模M意義下的答案
則f[i] = f[i - 1] * 100...0 + i【i是幾位就有幾個0】
可以寫出矩陣遞推式:
之后按位數(shù)分組矩乘就好了
#include<iostream> #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> #define LL long long int #define REP(i,n) for (int i = 1; i <= (n); i++) #define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt) #define cls(s) memset(s,0,sizeof(s)) using namespace std; const int maxn = 100005,maxm = 100005,INF = 1000000000; LL N,M; struct Matrix{LL s[3][3],n,m;Matrix(){cls(s); n = m = 0;} }A,F; Matrix operator *(const Matrix& a,const Matrix& b){Matrix ans;if (a.m !=b.n) return ans;ans.n = a.n; ans.m = b.m;for (int i = 0; i < ans.n; i++)for (int j = 0; j < ans.m; j++)for (int k = 0; k < a.m; k++)ans.s[i][j] = (ans.s[i][j] + a.s[i][k] * b.s[k][j] % M) % M;return ans; } Matrix qpow(Matrix a,LL b){Matrix ans; ans.n = ans.m = a.n;for (int i = 0; i < ans.n; i++) ans.s[i][i] = 1;for (; b; b >>= 1,a = a * a)if (b & 1) ans = ans * a;return ans; } int S[][3] = {{1,1,1},{0,1,1},{0,0,1} }; int main(){cin >> N >> M;A.n = A.m = 3;for (int i = 0; i < 3; i++)for (int j = 0; j < 3; j++)A.s[i][j] = S[i][j];F.n = 3; F.m = 1;F.s[0][0] = 0; F.s[1][0] = 0; F.s[2][0] = 1;for (LL bit = 1; ; bit *= 10){A.s[0][0] = bit % M * 10 % M;if (N < bit * 10){F = qpow(A,N - bit + 1) * F;break;}else F = qpow(A,bit * 10 - bit) * F;}cout << F.s[0][0] << endl;return 0; }轉載于:https://www.cnblogs.com/Mychael/p/8404702.html
總結
以上是生活随笔為你收集整理的BZOJ2326 [HNOI2011]数学作业 【矩阵快速幂】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中发红包案例之红包界面不出来的解
- 下一篇: poj1064 二分搜索 挑战程序设计竞