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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/C_13579/article/details/81836499

                                                 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);
	}
}

猜你喜欢

转载自blog.csdn.net/C_13579/article/details/81836499
今日推荐