J 洋灰三角
链接:https://www.nowcoder.com/acm/contest/136/J
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
洋灰是一种建筑材料,常用来筑桥搭建高层建筑,又称,水泥、混凝土。
WHZ有很多铸造成三角形的洋灰块,他想把这些洋灰三角按照一定的规律放到摆成一排的n个格子里,其中第i个格子放入的洋灰三角数量是前一个格子的k倍再多p个,特殊地,第一个格子里放1个。
WHZ想知道把这n个格子铺满需要多少洋灰三角。
输入描述:
第一行有3个正整数n,k,p。
输出描述:
输出一行,一个正整数,表示按照要求铺满n个格子需要多少洋灰三角,由于输出数据过大,你只需要输出答案模1000000007(1e9+7)后的结果即可。
备注:
对于100%的测试数据:
1 ≤ n ≤ 1000000000
1 ≤ k,p ≤ 1000
思路:容易知道公式第n个格子所需三角个数 An=k*A(n-1)+p
A1 = 1
A2 = k*A1+p
A3 = k*A2+p
. . .
. . .
. . .
A(n-1) = k*A(n-2)+p
An = k*A(n-1)+p
每项相加得:前n项和 Sn=k*S(n-1)+p*(n-1)+1,那么就可以利用矩阵快速幂来求解
k p 1 S(n-1) Sn
0 1 1 n-1 n
mi(3,3)= 0 0 1 , B(3,1)= 1 mi*B= 1
Code :
#include<iostream>
using namespace std;
typedef long long LL;
struct matrix{
LL d[5][5];
};
const LL MOD=1e9+7;
LL n,a,b;
matrix mm;
matrix chengfa(matrix &m1,matrix &m2);
void matrix_power(void);
int main()
{
ios::sync_with_stdio(false);
while(cin>>n>>a>>b){
n-=1;
matrix_power();
LL ans=(mm.d[1][1]+mm.d[1][2]+mm.d[1][3])%MOD;
cout<<ans<<endl;
}
return 0;
}
matrix chengfa(matrix &m1,matrix &m2)
{
matrix dd;
for(int i=1;i<=3;++i)
for(int j=1;j<=3;++j)
{
LL sum=0;
for(int k=1;k<=3;++k)
sum=(sum+m1.d[i][k]*m2.d[k][j])%MOD;
dd.d[i][j]=sum;
}
return dd;
}
void matrix_power(void)
{
matrix mi;
for(int i=1;i<=3;++i)
for(int j=1;j<=3;++j)
{
mm.d[i][j]=(i==j)?1:0;
mi.d[i][j]=0;
}
mi.d[1][1]=a; mi.d[1][2]=b;
mi.d[1][3]=mi.d[2][2]=mi.d[2][3]=mi.d[3][3]=1;
while(n){
if(n%2) mm=chengfa(mm,mi);
n/=2;
mi=chengfa(mi,mi);
}
}