/*
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的更多相关文章

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

  2. hdu 6050: Funny Function (2017 多校第二场 1006) 【找规律】

    题目链接 暴力打个表找下规律就好了,比赛时看出规律来了倒是,然而看这道题看得太晚了,而且高中的那些数列相关的技巧生疏了好多,然后推公式就比较慢..其实还是自身菜啊.. 公式是 #include< ...

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

  4. HDU 6170 - Two strings | 2017 ZJUT Multi-University Training 9

    /* HDU 6170 - Two strings [ DP ] | 2017 ZJUT Multi-University Training 9 题意: 定义*可以匹配任意长度,.可以匹配任意字符,问 ...

  5. hdu 5288 OO’s Sequence(2015 Multi-University Training Contest 1)

    OO's Sequence                                                          Time Limit: 4000/2000 MS (Jav ...

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

  7. hdu 5416 CRB and Tree(2015 Multi-University Training Contest 10)

    CRB and Tree                                                             Time Limit: 8000/4000 MS (J ...

  8. 2017ACM暑期多校联合训练 - Team 2 1006 HDU 6050 Funny Function (找规律 矩阵快速幂)

    题目链接 Problem Description Function Fx,ysatisfies: For given integers N and M,calculate Fm,1 modulo 1e ...

  9. hdu 6050 Funny Function 矩阵快速幂

    就算告诉我是矩阵快速幂我也推不出递推式呀!!! 官方题解: 对于任意i>=1,当j>=3时,有通过归纳法可以得到 进而推导出 后来自己重新推导了一遍 #include <iostre ...

随机推荐

  1. 并不对劲的2-SAT

    说明 板板题链接 这个人讲得很清楚 WAWAWAWA 建的边"不完整",比如当限制是"x为1时y一定为1"时,连x->y的边时,忘记连y'->x'的 ...

  2. Function(Of T) as T 泛型类型多态返回对象的实现

    Shared Function ResultT(Of T As result)(msg As String, Optional success As Boolean = False) As T Dim ...

  3. 【ES6 】声明变量的方式

    var function let const import class

  4. Python——用turtle画一个月饼

    今天是中秋节,首先在这里祝大家中秋快乐!那么提到中秋,我们首先想到的当然是香甜的月饼,所以我今天就在这里画一个月饼送给大家. 那么 要用Python画图,我们必须掌握并运用Turtle库,这个可以自己 ...

  5. Vue中的key到底有什么用?

    key是为Vue中的vnode标记的唯一id,通过这个key,我们的diff操作可以更准确.更快速 diff算法的过程中,先会进行新旧节点的首尾交叉对比,当无法匹配的时候会用新节点的key与旧节点进行 ...

  6. JavaScript和Java是不同公司开发的不同产品

    首先,JavaScript和Java是不同公司开发的不同产品.javascript是Netscape的产品.它的目的是扩展Netscape Navigator功能,开发一种可以嵌入到网页中的对象和事件 ...

  7. Go语言并发机制

    Go语言中的并发 使用goroutine编程 使用 go 关键字用来创建 goroutine .将go声明放到一个需调用的函数之前,在相同地址空间调用运行这个函数,这样该函数执行时便会作为一个独立的并 ...

  8. Centos7搭建solr集群

    1.复制4个Tomcat到solr-cloud目录下 [root@localhost software]# cp -r apache-tomcat-9.0.24 /usr/local/solr-clo ...

  9. kbmMW均衡负载与容灾(1)

    kbmMW为均衡负载与容灾提供了很好的机制,支持多种实现方式,现在看看最简单的一种,客户端控制的容灾和简单的负载均衡. 现在,我们将kbmMWServer部署到不同的服务器,或者在同一服务器部署多份实 ...

  10. vue项目图标

    项目图标iconfont 网址:http://www.iconfont.cn