牛客-牛客小白月赛6-J 洋灰三角

                                                 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
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<

 

你可能感兴趣的:(牛客,矩阵快速幂)