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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【HNOI2011】数学作业(BZOJ 2326)

發(fā)布時間:2025/4/16 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【HNOI2011】数学作业(BZOJ 2326) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目鏈接:http://www.lydsy.com/JudgeOnline/problem.php?id=2326 ? 設(shè)f[i]表示i的答案,那么 f[i] = f[i - 1] * 10 + i ? ? ?(i < 10) f[i] = f[i - 1] * 100 + i ? ?( ?100<=i<=999) …… ? 我們發(fā)現(xiàn)N的范圍很大所以要用矩陣加速遞推: 然后也需要分段改變遞推矩陣的系數(shù)。 ? #include #include #include #include #include #include #include #include #include #include #include #include #define MID(x,y) ((x+y)>>1) #define mem(a,b) memset(a,b,sizeof(a)) using namespace std;typedef long long LL;LL n, m; const int MAX = 5; struct Mat{int row, col;LL mat[MAX][MAX]; }; //initialize square matrix to unit matrix Mat unit(int n){Mat A;A.row = A.col = n;memset(A.mat, 0, sizeof(A.mat));for (int i = 0; i < n; i ++)A.mat[i][i] = 1;return A; } //return A*B%mod Mat mul(Mat A, Mat B, int mod){Mat C;C.row = A.row;C.col = B.col;for (int i = 0; i < A.row; i ++){for (int j = 0; j < B.col; j ++){C.mat[i][j] = 0;for (int k = 0; k < A.col; k ++)//注意這里要保證乘法不溢出,否則還需要設(shè)計特殊的乘法模C.mat[i][j] += A.mat[i][k] * B.mat[k][j];C.mat[i][j] %= mod;}}return C; }; //return A^n%mod Mat exp_mod(Mat A, LL n, int mod){Mat res = unit(A.row);while(n){if (n & 1LL){res = mul(res, A, mod);}A = mul(A, A, mod);n >>= 1;}return res; } Mat A, res;void changeA(LL p){A.col = A.row = 3;A.mat[0][0] = p % m; A.mat[0][1] = 1; A.mat[0][2] = 0;A.mat[1][0] = 0; A.mat[1][1] = 1; A.mat[1][2] = 1;A.mat[2][0] = 0; A.mat[2][1] = 0; A.mat[2][2] = 1; }void init(){res.col = 1;res.row = 3;res.mat[0][0] = 0;res.mat[1][0] = 1;res.mat[2][0] = 1;changeA(10); }int main(){cin >> n >> m;init();LL k1 = 0;LL k2 = 9;LL ct = 10;while(n >= k2){res = mul(exp_mod(A, k2-k1, m), res, m);k1 = k2;if (k2 == 99999999999999999)k2 = 100000000000000001;k2 = k2 * 10 + 9;changeA(10*ct);ct *= 10;}if (n > k1)res = mul(exp_mod(A, n-k1, m), res, m);cout << res.mat[0][0] << endl;return 0; } ?

轉(zhuǎn)載于:https://www.cnblogs.com/AbandonZHANG/archive/2013/04/02/4114231.html

總結(jié)

以上是生活随笔為你收集整理的【HNOI2011】数学作业(BZOJ 2326)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。