1013 3的幂的和
基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题
求:3^0 + 3^1 +...+ 3^(N) mod 1000000007
Input
输入一个数N(0 <= N <= 10^9)
Output
输出:计算结果
Input示例
3
Output示例
40
思路:需要我们自己构造矩阵,还算简单,画几下就出来了。设X矩阵为 X = ,Y=
,Y*X=
,可知X^n*Y=
,这里X^n可以用矩阵幂运算,最后再Y相乘。(f(i)表示3^i)。值得注意的是要用long long,用int WA了一次。
#include<stdio.h>
#include<string.h>
using namespace std;
#define ll long long
const ll data=1e9+7;
struct mat{
ll a[2][2];//创建矩阵
};
mat mat_return(mat x,mat y)
{
mat res;
memset(res.a ,0 ,sizeof(res.a ));
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
for(int k=0;k<2;k++){
res.a[i][j]=(res.a[i][j]+x.a[i][k]*y.a[k][j]%data)%data;
}
}
}
return res;
}
int main()
{
int n;
scanf("%d",&n);
mat res,c;//注意这个res和mat_return()函数里的并不是一个
c.a[0][0]=1,c.a[0][1]=0,c.a[1][0]=1;
c.a[1][1]=3;
memset(res.a,0,sizeof(res.a ));
for(int i=0;i<2;i++)
res.a[i][i]=1;//单位矩阵,都一样
while(n>0){//接下来就类似快速幂运算了
if(n&1)
res=mat_return(res,c);
c=mat_return(c,c);
n/=2;
}
mat e;
e.a[0][0]=1,e.a[0][1]=3,e.a[1][0]=0;
e.a[1][1]=0;
res=mat_return(e,res);//最后与思路中的Y相乘
printf("%lld\n",res.a[0][0]);
return 0;
}