您的位置:首页 > 其它

等比数列二分求和

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;

}


就是矩阵的求幂上也用了分制的思想。就是这样了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: