等比数列二分求和(logn复杂度)
看完这个之后,感觉数学简直太厉害了 转载自:http://blog.csdn.net/acdreamers/article/details/7851144
今天我们学习如何有效地求表达式的值。对于这个问题,用二分解决比较好。
(1)当时,
(2)当时,那么有
(3)当时,那么有
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | #include <iostream> #include <string.h> #include <stdio.h> using namespace std; const int M = 1000000007; typedef long long LL; LL power(LL a,LL b) { LL ans = 1; a %= M; while (b) { if (b & 1) { ans = ans * a % M; b--; } b >>= 1; a = a * a % M; } return ans; } LL sum(LL a,LL n) { if (n == 1) return a; LL t = sum(a,n/2); if (n & 1) { LL cur = power(a,n/2+1); t = (t + t * cur % M) % M; t = (t + cur) % M; } else { LL cur = power(a,n/2); t = (t + t * cur % M) % M; } return t; } int main() { LL a,n; while (cin>>a>>n) cout<<sum(a,n)<<endl; return 0; } |
题目:http://poj.org/problem?id=3233
题意:矩阵求和
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | #include <iostream> #include <string.h> #include <stdio.h> using namespace std; const int N = 35; struct Matrix { int m[N][N]; }; Matrix I; int n,k,M; Matrix add(Matrix a,Matrix b) { Matrix c; for ( int i=0; i<n; i++) { for ( int j=0; j<n; j++) { c.m[i][j] = a.m[i][j] + b.m[i][j]; c.m[i][j] %= M; } } return c; } Matrix multi(Matrix a,Matrix b) { Matrix c; for ( int i=0; i<n; i++) { for ( int j=0; j<n; j++) { c.m[i][j] = 0; for ( int k=0; k<n; k++) c.m[i][j] += a.m[i][k] * b.m[k][j]; c.m[i][j] %= M; } } return c; } Matrix power(Matrix A, int n) { Matrix ans = I,p = A; while (n) { if (n & 1) { ans = multi(ans,p); n--; } n >>= 1; p = multi(p,p); } return ans; } Matrix sum(Matrix A, int k) { if (k == 1) return A; Matrix t = sum(A,k/2); if (k & 1) { Matrix cur = power(A,k/2+1); t = add(t,multi(t,cur)); t = add(t,cur); } else { Matrix cur = power(A,k/2); t = add(t,multi(t,cur)); } return t; } int main() { while ( scanf ( "%d%d%d" ,&n,&k,&M)!=EOF) { Matrix A; for ( int i=0; i<n; i++) { for ( int j=0; j<n; j++) { scanf ( "%d" ,&A.m[i][j]); A.m[i][j] %= M; I.m[i][j] = (i==j); } } Matrix ans = sum(A,k); for ( int i=0; i<n; i++) { for ( int j=0; j<n; j++) printf ( "%d " ,ans.m[i][j]); puts ( "" ); } } return 0; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库