等比数列二分求和
2015-09-29 23:49
405 查看
等比数列二分求和
跟着大牛的步伐,看了这篇博文,记录一下,原文:http://blog.csdn.net/acdreamers/article/details/7851144首先先是看了一下快速幂取模,我竟然是现在才知道,惭愧==
ll pow(ll a,ll b,ll m) { ll ans=1; if(b==0) return 1; if (b == 1) return a%m; ll t=pow(a,b>>1,m); t=t*t%m; if(b%2!=0) { t=t*a%m; } return t; }
求和的思路就是分制,递归,同求幂以及之后矩阵的求幂有异曲同工之妙。
ll sum(ll a,ll n) { if(n==1) return a; ll t=sum(a,n/2); if(n%2==0) { ll temp=pow(a,n/2,M); t=(t+temp*t%M)%M; } else { ll temp=pow(a,n/2+1,M); t=(t+t*temp%M)%M; t=(t+temp)%M; } return t; }
然后就是做了一道题 ,是poj上的矩阵的题,这还是我第一次做矩阵的题,惭愧==
#include <iostream> #include <map> #include <vector> #include <cstdio> #include <set> #include <string> #include <cstring> #include <algorithm> using namespace std; const int N=35; struct Matrix { int m ; }; 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 k) { if(k == 1)return A; Matrix temp = power(A,k/2); Matrix temp2 = multi(temp,temp); return k%2 == 0? temp2: multi(temp2,A); } Matrix sum(Matrix A,int k) { if(k==1) return A; Matrix t=sum(A,k/2); if(k&1) { Matrix temp=power(A,k/2+1); t=add(t,multi(t,temp)); t=add(t,temp); } else { Matrix temp=power(A,k/2); t=add(t,multi(t,temp)); } 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; } } 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; }
就是矩阵的求幂上也用了分制的思想。就是这样了。
相关文章推荐
- Handler,Message,Looper深入系统学习
- 折腾kali linux2.0
- python中lambda函数
- Linux学习笔记之 pstree,htop,glances,dstat 命令使用
- JDBC Dao的实现与测试
- windows如何方便快速在指定文件夹打开命令行
- Mac下获取AppStore安装包文件路径
- PDO事务处理
- ios开发 17个常用代码整理
- 第1章 Mysql启动与关闭
- 5、Android编译安装过程
- android新控件之toolbar,floatingActionButton,SnackBar,CollapsingToolbarLayout
- 如何私有化路由器
- 怎么样把一个大的文件压缩成几部分
- linux基础之sed命令
- html标签p和span
- C#对.CSV格式的文件--逗号分隔值文件 的读写操作及上传ftp服务器操作方法总结
- c#读取数据库内容
- kvm虚拟化平台部署
- 《当幸福来敲门》观后感