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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

快速幂(二进制,十进制)

發(fā)布時間:2025/4/16 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 快速幂(二进制,十进制) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

矩陣快速冪:

#include<iostream> #include<cstdio> #include<cstring>using namespace std; typedef long long LL;const int maxn = 3*1e6+5; struct Matrix{long long an[2][2]; };LL a, b, x0, x1; char n[maxn]; LL mod;Matrix Multi(Matrix A, Matrix B){Matrix C;C.an[0][0] = C.an[0][1] = C.an[1][0] = C.an[1][1] = 0;for(int i = 0; i < 2; i++)for(int j = 0; j < 2; j++)for(int k = 0; k < 2; k++)C.an[i][j] = (C.an[i][j] + A.an[i][k] * B.an[k][j]) % mod;return C; }//二進(jìn)制快速冪 Matrix quick_mod2(Matrix A, long long n){Matrix B;B.an[0][0] = B.an[1][1] = 1;B.an[0][1] = B.an[1][0] = 0;while(n){if(n&1) B = Multi(B, A);A = Multi(A, A);n >>= 1;}return B; }//十進(jìn)制快速冪 Matrix quick_mod10(Matrix A, char s[]){Matrix B, t = A;B.an[0][0] = B.an[1][1] = 1;B.an[0][1] = B.an[1][0] = 0;int len = strlen(s);len--;while(len >= 0){LL num = s[len] - '0';Matrix cur = t;for(int i = 1; i <= num; i++) B = Multi(B, t);for(int i = 1; i < 10; i++)cur = Multi(cur, t);t = cur;len--;}return B; }int main() {scanf("%lld%lld%lld%lld", &x0, &x1, &a, &b);scanf("%s", n);scanf("%lld", &mod);int len = strlen(n);Matrix A, ans;A.an[0][0] = a; A.an[0][1] = b;A.an[1][0] = 1; A.an[1][1] = 0;ans = quick_mod10(A, n);// printf("%lld %lld\n", ans.an[0][0], ans.an[0][1]);printf("%lld\n", (ans.an[1][0]*x1 + ans.an[1][1]*x0) % mod); }

題目:??投嘈5谖鍒?https://ac.nowcoder.com/acm/contest/885/B

?

#include<iostream> #include<cstdio> #include<cstring>using namespace std; typedef long long LL;const int maxn = 3*1e6+5; struct Matrix{long long an[2][2]; };LL a, b, x0, x1; char n[maxn]; LL mod;Matrix Multi(Matrix A, Matrix B){Matrix C;C.an[0][0] = C.an[0][1] = C.an[1][0] = C.an[1][1] = 0;for(int i = 0; i < 2; i++)for(int j = 0; j < 2; j++)for(int k = 0; k < 2; k++)C.an[i][j] = (C.an[i][j] + A.an[i][k] * B.an[k][j]) % mod;return C; }Matrix quick_mod(Matrix A, long long n){Matrix B;B.an[0][0] = B.an[1][1] = 1;B.an[0][1] = B.an[1][0] = 0;while(n){if(n&1) B = Multi(B, A);A = Multi(A, A);n >>= 1;}return B; }//十進(jìn)制快速冪 Matrix quick_mod10(Matrix A, char s[]){Matrix B, t = A;B.an[0][0] = B.an[1][1] = 1;B.an[0][1] = B.an[1][0] = 0;int len = strlen(s);len--; // LL num = s[len] - '0' - 1; // Matrix cur = t; // for(int i = 1; i <= num; i++) // B = Multi(B, t); // for(int i = 1; i < 10; i++) // cur = Multi(cur, t); // t = cur; // len--;while(len >= 0){LL num = s[len] - '0';Matrix cur = t;for(int i = 1; i <= num; i++) B = Multi(B, t);for(int i = 1; i < 10; i++)cur = Multi(cur, t);t = cur;len--;}return B; }int main() {scanf("%lld%lld%lld%lld", &x0, &x1, &a, &b);scanf("%s", n);scanf("%lld", &mod);int len = strlen(n);Matrix A, ans;A.an[0][0] = a; A.an[0][1] = b;A.an[1][0] = 1; A.an[1][1] = 0;// int k = 0;// for(int i = len-1;i >= 0;--i)// {// if(n[i] != '0'){// k = i;// break;// }// }// n[k] -= 1;// for(int i = len-1;i > k;--i)// n[i] = '9';ans = quick_mod10(A, n);// printf("%lld %lld\n", ans.an[0][0], ans.an[0][1]);printf("%lld\n", (ans.an[1][0]*x1 + ans.an[1][1]*x0) % mod); }

?

?

普通二進(jìn)制快速冪、十進(jìn)制快速冪

//二進(jìn)制快速冪 LL quick_mod2(LL x, LL n, LL mod) //x ^ n {LL res = 1;while(n){if(n & 1) res = res * x % mod;x = x * x % mod;n >>= 1;}return res; }//十進(jìn)制快速冪 LL quick_mod10(LL x, char s[], LL mod){LL res = 1, t = x;int len = strlen(s); len--;while(len >= 0){int num = s[i] - '0', cur = t;for(int i = 1; i <= num; i++)ans = ans * t % mod;for(int i = 1; i < 10; i++)cur = cur * t % mod;t = cur;len--;}return res; }

?

總結(jié)

以上是生活随笔為你收集整理的快速幂(二进制,十进制)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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