小爱密码(斐波那契前缀和)

本文介绍了ACM竞赛中的一道关于斐波那契数列的题目,详细解析了如何利用矩阵乘法快速求解斐波那契数列的前缀和问题。通过链接可以访问到具体的题目详情和代码实现。
摘要由CSDN通过智能技术生成

ACM题集:https://blog.csdn.net/weixin_39778570/article/details/83187443
题目链接:https://code.mi.com/problem/list/view?id=137&cid=7

小爱同学有一个智能密码锁。锁上有九位数字,小爱同学每次会给A,B,C,D,mod,n六个正整数。 
题目是这样的:

F(1) = A, F(2) = BF(1)=A,F(2)=B
F(n) = F(n-1) * F(n-2) * C^D   (n >= 2) 
F(n)=F(n−1)⋅F(n−2)⋅C^D          (n>2)

现在小爱同学想计算出 G(n) 的值(G(n)为F(n)的前n项积),并用该值作为密码锁的密码。
由于结果过大,所以答案 G(n)%mod
多组数据。每组包含 6 个整数,分别代表 A, B, C, D, mod, n. (1<=A,B,C,D,mod,n<=1000000000);
数据组数不超过2000.
------------------------------------------------------------------------------------------
	斐波那契前缀和 
因为乘积满足幂加的关系
容易知道要求幂的斐波那契数列 
然后要求前n项和可知是斐波那契前缀和 
又斐波那契前缀和与与后面第二项的差-1相等
重点是C^D这一项的幂....
观察规律可知是 fa+fb-n
fa为a的幂
fb为b的幂 
(f*A*n) =  [fib(n), fib(n+1)]下标0开始 
n:		1 2 3 4 5 6  7     (以下表示幂)
B	    0 1 1 2 3 5  8 13....这行是 Fib...
前缀和  0 1 2 4	7 12 20	 sumA(n-1) = f(n+1)-1 = (f*A*n)[1]-1 下标从0开始

A       1 0 1 1 2 3  5  8
前缀和  1 1 2 3 5 8  13  sumB(n-1) = f(n) = (f*A*n)[0]

C^D     0 0 1 2 4 7  12
前缀和  0 0 1 3 7 14 26  sumC(n-1) =  sumA(n-1) + sumB(n-1) - n
code
#include<bits/stdc++.h> 
#define ll long long
#define fo(i,j,n) for(register int i=j; i<=n; ++i)
using namespace std;
ll a,b,c,d,mod,n,x,MOD;
int q_pow(ll a, ll n){
   
	int ret = 1;
	while(n){
   
		if(n&1)ret = ret*a%mod;
		a = a*a%mod;
		n>>=1;
	}
	return ret%mod;
}
int phi(int n){
   
	int ans 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值