HDU 6050 - Funny Function | 2017 Multi-University Training Contest 2
/*
HDU 6050 - Funny Function [ 公式推导,矩阵快速幂 ]
题意:
F(1,1) = F(1, 2) = 1
F(1,i) = F(1, i-1) + 2 * F(1, i-2) , i >= 3
F(i, j) = ∑ F(i-1, j) , k∈[j, j+N-1]
给定 N, M < 2^63, 求 F(M,1)
分析:
∵ F(2,1) = F(1,1) + F(1,2) + ... + F(1,N)
F(2,2) = F(2,1) + F(1,N+1) - F(1,1) ∴ 2*F(2,1) + F(2,2) = 3*F(2,1) + F(1,N+1) - F(1,1)
= ( F(1,1) + 2*F(1,1)+F(1,2) + 2*F(1,2)+F(1,3) + ... + 2*F(1,N-1)+F(1,N) + 2*F(1,N) ) + F(1,N+1) - F(1,1)
= F(1,1) + ( F(1,3) + F(1,4) + ... + F(1,N+1) ) + 2*F(1,N) + F(1,N+1)
= F(1,3) + F(1,4) + ... + F(1,N+2)
= F(2,3) 将结论推至一般情况:F(i,j) = F(i,j-1) + 2*F(i,j-2) .......(1) ∵ F(2,1) = F(1,1) + F(1,2) + ... + F(1,N)
F(2,1) + F(1,1) = 2*F(1,1) + F(1,2) + ... + F(1,N)
= 2*F(1,3) + F(1,4) + ... + F(1,N) ∴ 当N为偶数时 F(2,1) = F(1,N+1) - F(1,1)
当N为奇数时 F(2,1) = 2*F(1,N) - F(1,1) 当N为偶数时:
F(2,1) = F(1,N+1) - F(1,1)
F(2,2) = F(1,N+2) - F(1,2)
写为矩阵形式:
( F(2,2) , F(2,1) ) = ( F(1,N+2) - F(1,1) , F(1,N+1) - F(1,1) )
= ( F(1,N+2) , F(1,N+1) ) - ( F(1,2) , F(1,1) )
= ( A^N - I ) * ( F(1,2) , F(1,1) )
∴ 根据结论(1)
( F(M,2) , F(M,1) ) = ( A^N - I )^M * ( F(1,2) , F(1,1) ) 当N为奇数时:
F(2,1) = 2*F(1,N) - F(1,1)
F(2,2) = 2*F(1,N+1) - F(1,2)
写为矩阵形式:
( F(2,2) , F(2,1) ) = ( 2*F(1,N+1) - F(1,1) , 2*F(1,N) - F(1,1) )
= 2*( F(1,N+2) , F(1,N+1) ) - ( F(1,2) , F(1,1) )
= ( 2 * A^(N-1) - I ) * ( F(1,2) , F(1,1) )
∴ 根据结论(1)
( F(M,2) , F(M,1) ) = ( 2 * A^(N-1) - I )^M * ( F(1,2) , F(1,1) ) 编码时长: INF(-2)
*/
#include <bits/stdc++.h>
using namespace std;
#define LL long long
const LL MOD = 1e9+7;
const int sz = 2;
struct Matrix {
LL a[sz][sz];
Matrix() {
memset(a, 0, sizeof(a));
}
Matrix operator * (const int & t) const {
Matrix C;
for (int i = 0; i < sz; i++)
for (int j = 0; j < sz; j++)
C.a[i][j] = a[i][j] * t % MOD;
return C;
}
Matrix operator * (const Matrix &B) const {
Matrix C;
for (int i = 0; i < sz; i++)
for (int k = 0; k < sz; k++)
for (int j = 0; j < sz; j++)
C.a[i][j] = (C.a[i][j] + a[i][k]*B.a[k][j] % MOD) % MOD;
return C;
}
Matrix operator ^ (const LL &t) const {
Matrix A = (*this), res;
for (int i = 0; i < sz; i++) res.a[i][i] = 1;
LL p = t;
while (p) {
if (p&1) res = res*A;
A = A*A;
p >>= 1;
}
return res;
}
}A, B, C;
LL n, m, ans;
void init()
{
A.a[0][0] = 1; A.a[0][1] = 2;
A.a[1][0] = 1; A.a[1][1] = 0;
}
void solve()
{
if (m == 1 || n == 1) ans = 1;
else if (n&1)
{
B = A^(n-1);
B = B*2;
for (int i = 0; i < 2; i++) B.a[i][i] = (B.a[i][i] + MOD-1) % MOD;
C = B^(m-1);
ans = (C.a[1][0] + C.a[1][1]) % MOD;
}
else
{
B = A^n;
for (int i = 0; i < 2; i++) B.a[i][i] = (B.a[i][i] + MOD-1) % MOD;
C = B^(m-1);
ans = (C.a[1][0] + C.a[1][1]) % MOD;
}
}
int main()
{
int t; scanf("%d", &t);
while (t--)
{
scanf("%lld%lld", &n, &m);
init();
solve();
printf("%lld\n", ans);
}
}
HDU 6050 - Funny Function | 2017 Multi-University Training Contest 2的更多相关文章
- HDU 6050 Funny Function —— 2017 Multi-University Training 2
Funny Function Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- hdu 6050: Funny Function (2017 多校第二场 1006) 【找规律】
题目链接 暴力打个表找下规律就好了,比赛时看出规律来了倒是,然而看这道题看得太晚了,而且高中的那些数列相关的技巧生疏了好多,然后推公式就比较慢..其实还是自身菜啊.. 公式是 #include< ...
- 2017 Multi-University Training Contest - Team 2 &&hdu 6050 Funny Function
Funny Function Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- HDU 6170 - Two strings | 2017 ZJUT Multi-University Training 9
/* HDU 6170 - Two strings [ DP ] | 2017 ZJUT Multi-University Training 9 题意: 定义*可以匹配任意长度,.可以匹配任意字符,问 ...
- hdu 5288 OO’s Sequence(2015 Multi-University Training Contest 1)
OO's Sequence Time Limit: 4000/2000 MS (Jav ...
- hdu 6301 Distinct Values (2018 Multi-University Training Contest 1 1004)
Distinct Values Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- hdu 5416 CRB and Tree(2015 Multi-University Training Contest 10)
CRB and Tree Time Limit: 8000/4000 MS (J ...
- 2017ACM暑期多校联合训练 - Team 2 1006 HDU 6050 Funny Function (找规律 矩阵快速幂)
题目链接 Problem Description Function Fx,ysatisfies: For given integers N and M,calculate Fm,1 modulo 1e ...
- hdu 6050 Funny Function 矩阵快速幂
就算告诉我是矩阵快速幂我也推不出递推式呀!!! 官方题解: 对于任意i>=1,当j>=3时,有通过归纳法可以得到 进而推导出 后来自己重新推导了一遍 #include <iostre ...
随机推荐
- 并不对劲的2-SAT
说明 板板题链接 这个人讲得很清楚 WAWAWAWA 建的边"不完整",比如当限制是"x为1时y一定为1"时,连x->y的边时,忘记连y'->x'的 ...
- Function(Of T) as T 泛型类型多态返回对象的实现
Shared Function ResultT(Of T As result)(msg As String, Optional success As Boolean = False) As T Dim ...
- 【ES6 】声明变量的方式
var function let const import class
- Python——用turtle画一个月饼
今天是中秋节,首先在这里祝大家中秋快乐!那么提到中秋,我们首先想到的当然是香甜的月饼,所以我今天就在这里画一个月饼送给大家. 那么 要用Python画图,我们必须掌握并运用Turtle库,这个可以自己 ...
- Vue中的key到底有什么用?
key是为Vue中的vnode标记的唯一id,通过这个key,我们的diff操作可以更准确.更快速 diff算法的过程中,先会进行新旧节点的首尾交叉对比,当无法匹配的时候会用新节点的key与旧节点进行 ...
- JavaScript和Java是不同公司开发的不同产品
首先,JavaScript和Java是不同公司开发的不同产品.javascript是Netscape的产品.它的目的是扩展Netscape Navigator功能,开发一种可以嵌入到网页中的对象和事件 ...
- Go语言并发机制
Go语言中的并发 使用goroutine编程 使用 go 关键字用来创建 goroutine .将go声明放到一个需调用的函数之前,在相同地址空间调用运行这个函数,这样该函数执行时便会作为一个独立的并 ...
- Centos7搭建solr集群
1.复制4个Tomcat到solr-cloud目录下 [root@localhost software]# cp -r apache-tomcat-9.0.24 /usr/local/solr-clo ...
- kbmMW均衡负载与容灾(1)
kbmMW为均衡负载与容灾提供了很好的机制,支持多种实现方式,现在看看最简单的一种,客户端控制的容灾和简单的负载均衡. 现在,我们将kbmMWServer部署到不同的服务器,或者在同一服务器部署多份实 ...
- vue项目图标
项目图标iconfont 网址:http://www.iconfont.cn