/*
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. [转帖]Linux 下实践 VxLAN:虚拟机和 Docker 场景

    Linux 下实践 VxLAN:虚拟机和 Docker 场景 https://www.cnblogs.com/bakari/p/11264520.html 实践了下 没问题 作者写的很perfect ...

  2. 后缀数组 LCP--模板题

    题意: 给你S串和T串,用T串的所有前缀去匹配S串(匹配值是最长公共子串). 问你总值相加是多少. 思路: 先把两个S,T串倒过来,再拼接 S#T 合成一串,跑一下后缀数组 在排序好的rank里计算每 ...

  3. 如何利用swoole搭建一個簡易聊天室

    <?php class Chat { const HOST = '0.0.0.0';//ip地址 0.0.0.0代表接受所有ip的访问 const PART = 82;//端口号 private ...

  4. Python基础『二』

    目录 语句,表达式 赋值语句 打印语句 分支语句 循环语句 函数 函数的作用 函数的三要素 函数定义 DEF语句 RETURN语句 函数调用 作用域 闭包 递归函数 匿名函数 迭代 语句,表达式 赋值 ...

  5. pycharm 安装好,只要三部! 超级简单教程!

    pycharm的安装,确实比较麻烦,所以特意做了一期简单版本的安装教程,跟着教程走...只要三部! →下载 链接:https://pan.baidu.com/s/1JxZgAhPVKAIoM1_jpD ...

  6. linux + qt 环境搭建

    下载地址 install qt huqian@huqian-Lenovo-IdeaPad-Y400:~/XRF$ ls qt-opensource-linux-x64-.run SourceFile ...

  7. oracle建表详细信息

    一张用户表 -- Create table create table OA_DM.DM_GY_USER ( ), username ) not null, loginname ) not null, ...

  8. Spring 的 Bean 管理(注解方式)

    Spring 的 Bean 管理(注解方式) 1. 导入必要的 jar 包和 xml 文件 使用注解需要导入 spring-aop 的 jar 包. applicationContext.xml 文件 ...

  9. IIS和apache并存windows服务器

    方法三: 将apache设为使用80端口,IIS使用其它端口,比如81,然后将apache作为IIS的代理.速度有影响.在httpd.conf里面,取消下面四行的注释:LoadModule proxy ...

  10. QT 安卓动态获取权限

    一:在AndroidManifest.xml文件中赋予相关权限 二: package ckdz.Appproject; import android.Manifest; import android. ...