快速幂(二进制,十进制)
生活随笔
收集整理的這篇文章主要介紹了
快速幂(二进制,十进制)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
矩陣快速冪:
#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_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; }//十進制快速冪 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); }題目:牛客多校第五場?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; }//十進制快速冪 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); }?
?
普通二進制快速冪、十進制快速冪
//二進制快速冪 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; }//十進制快速冪 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; }?
總結
以上是生活随笔為你收集整理的快速幂(二进制,十进制)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2019牛客第四场I题 string
- 下一篇: 逆元(求多个逆元)