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 ...
随机推荐
- linux 软连接和 硬链接的区别
Linux软链接硬链接的区别 ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接.当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下 ...
- shell 字符
Shell 中的符号: 在shell中有很多符号代表了一些意思,重点说说 键盘上的符号在shell中的意义. 通配符: ~ 匹配家目录 ? 匹配单个字符.( ?之匹配单一的一个字符.x11 这种的就 ...
- Java中关于Integer, String 类型变量 == 与 equals 判断的坑
== 与 equals()的联系: ==: 我们都知道Java中 == 对用于基础数据类型(byte, short, int, long, float, double, boolean, char)判 ...
- 数据库连接池的sqlhelper
import pymysql import threading from DBUtils.PooledDB import PooledDB """ storage = { ...
- ArrayList,LinkedList,Vector区别.TreeSet,TreeSet,LinkedHashSet区别
ArrayList: 基于数组的数据结构,地址连续,一旦数据保存好了,查询效率比较高,但是因为其地址连续,所以增删数据需要移动数据,影响速度 内部数组长度默认为10,当需要扩容时,数组长度按1.5倍增 ...
- ASP.NET Core如何限制请求频率
原文:ASP.NET Core如何限制请求频率 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.ne ...
- Android 直连SQL
在工作中遇到需求需要Android直接连接SQL,看了一些人说不建议直连,但我对性能没有要求,甚至说只要在局域网内能够使用就行,简单说把手机当作一个简单的移动操作点. 代码的话,网上都有比如: htt ...
- js循环遍历性能
定length for循环 (有length) 不定length for循环(使用数组length) 不定length for循环(判断数组length是否存在) forEach(Array自带,对某 ...
- ThreadLocal的原理与使用
前言 在java web项目中,经常会使用到单例对象,从服务器启动那一时刻就实例化全局对象.然后会对某些全局对象的属性进行修改之类的操作,但是我们知道项目一般都是部署到tomcat.Jboss之类的服 ...
- work mark
<detection name="tracking" open="1" shape="rect" rect="(608,16 ...