快速幂

#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> using namespace std; const int maxn = 909529; int a[maxn],rec[maxn],b[maxn]; int lena = 1, len = 1, n; void multim() { memset(b, 0, sizeof(b)); for (int i = 1; i <= lena; i++) { for (int j = 1; j <= lena; j++) { b[i + j - 1] += a[i] * a[j]; b[i + j] += b[i + j - 1] / 10; b[i + j - 1] %= 10; } } lena = lena + lena; //cout << lena << endl; while (lena!=1&&!b[lena]) lena--; if (lena > 500) lena = 500; for (int i = 1; i <= lena;i++) a[i] = b[i]; } void multi() { memset(b, 0, sizeof(b)); for (int i = 1; i <= len; i++) { for (int j = 1; j <= lena; j++) { b[i + j - 1] += rec[i] * a[j]; b[i + j] += b[i + j - 1] / 10; b[i + j - 1] %= 10; } } len = len + lena; while (len!=1&&!b[len])len--; if (len > 500) len = 500; for (int i = 1; i <= len; i++) { //printf("rec[%d]当前的值是%d,b[%d]当前的值是%d\n", i,rec[len],i, b[len]); rec[i] = b[i]; } } void modpow() { //快速幂 while (n) { if (n & 1) multi(); multim(); n >>= 1; } } int main(void) { rec[1] = 1; a[1] = 2; cin >> n; printf("%d\n", int(n * log10(2.0) + 1)); modpow(); rec[1]--; //printf("%d\n", len); for (int i = 500; i >= 1; i--) { printf("%d", rec[i]); if (!((i - 1) % 50))puts(""); } return 0; }
计算机小白记录学习过程,喜欢就点个推荐和关注吧O(∩_∩)O哈哈~

浙公网安备 33010602011771号