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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[CODEVS 1281] Xn数列

發(fā)布時間:2025/3/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [CODEVS 1281] Xn数列 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

描述

給你6個數(shù),m, a, c, x0, n, g
Xn+1 = ( aXn + c ) mod m,求Xn
http://codevs.cn/problem/1281/


分析

比較裸的矩陣乘法題, 好久沒做了, 寫寫思路

假設矩陣 A = { {a1, a2}, {a3, a4} }, B = { {b1, b2}, {b3, b4} }.
根據(jù)矩陣乘法的計算方法, 有 :
A×B = { {a1b1+a2b2, a1b2+a2b4}, {a3b1+a4b3, a3b2+a4b4} }.
那么我們想得到的是 a*Xn + c = Xn+1
假設 X 存在a1里, 那么應有 Xn * b1 + a2 * b2 = Xn+1
那么就可以得到 a2 = 1, b1 = a, b2 = c.
(為什么不能 a2 = c, b2 = 1 ? 因為乘完一次 a2 就變了, 下個加的就不是 c 了).

這樣矩陣就建好了, 接下來就是按部就班的矩陣乘法了.
不過, 這里數(shù)據(jù)太大, 不使用特殊技巧用 unsigned long long 都會溢出. 高精度 ? 其實不用, 因為最后都要模一下.

特殊技巧

用類似快速冪的方法寫一個快速加, 加一下模一下, 用來避免直接乘的溢出.


代碼

20ms 256kB
額… 難道 mod 和 sum 都是保留字 ? 為啥都有高亮 ?

#include<cstdio> using namespace std; typedef long long LL;LL mod, a, c, x0, n, g;struct Matrix {LL m[2][2]; } base, X0;// return a * b LL quickadd(LL a, LL b) {LL ans = 0;a %= mod; b %= mod;while(b > 0) { if(b & 1) ans = (ans + a) % mod; a = (a + a) % mod; b >>= 1;}return ans; }Matrix mul(Matrix a, Matrix b) {Matrix ans;for(int i = 0; i < 2; i++)for(int j = 0; j < 2; j++) {LL sum = 0;for(int k = 0; k < 2; k++)sum = (sum + quickadd(a.m[i][k], b.m[k][j])) % mod;ans.m[i][j] = sum;}return ans; }Matrix pow(Matrix a, LL n) {Matrix p = {{1, 0, 0, 1}};while(n > 0) {if(n & 1) p = mul(p, a);a = mul(a, a);n /= 2;}return p; }int main() {scanf("%lld%lld%lld%lld%lld%lld", &mod, &a, &c, &x0, &n, &g);base = (Matrix) {{a, 0, 1, 1}};X0 = (Matrix){{x0, c, 0, 0}};Matrix ans = mul(X0, pow(base, n));printf("%lld\n", ans.m[0][0] % g);return 0; }

總結(jié)

以上是生活随笔為你收集整理的[CODEVS 1281] Xn数列的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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