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 ...
随机推荐
- kafka安装使用配置1.2
进入cd /usr/local/flume/conf/ vi kafka.conf 配置 agent.sources=s1 agent.channels=c1 agent.sinks=k1 agent ...
- SQL Server 验证身份证合法性函数(使用VBScript.RegExp)
原文:SQL Server 验证身份证合法性函数(使用VBScript.RegExp) 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/wzy0623 ...
- kubectl相关指令
在列出.描述.修改或删除其他命名空间中的对象时,需要给kubect1命令传递--namespace(或-n)选项.如果不指定命名空间,kubect1将在当前上下文中配置的默认命名空间中执行操作.而当前 ...
- Petya and Construction Set(图的构造) Codeforces Round #583 (Div. 1 + Div. 2, based on Olympiad of Metropolises)
题意:https://codeforc.es/contest/1214/problem/E 有2n个点,每个2*i和2*i-1的距离必须是Di(<=n),现在让你构造这个树. 思路: 因为Di小 ...
- Q函数的使用
""" Q函数的使用"""# 查询username 或者nicjname 都为zhangsan 的用户# user_list = Weibo ...
- redis 事务 事务机制详解 MULTI、EXEC、DISCARD、WATCH
1. Redis服务端是个单线程的架构,不同的Client虽然看似可以同时保持连接,但发出去的命令是序列化执行的,这在通常的数据库理论下是最高级别的隔离2. 用MULTI/EXEC 来把多个命令组装成 ...
- Jmeter之Linux安装(Xshell),分布式运行Linux作为slave机
甲方爸爸要求,用Linux压测...... 所以在公司服务器Linux上搭建Jmeter 但实际一个Jmeter程序也有程序瓶颈~ 所以在Jmeter瓶颈下,搭建分布式压测系统.(也许可以尝试在一 ...
- signalfx的中间件监控指标so cool
signalfx的中间件监控指标so cool www.jianshu.com 对于我们做运维的来说,监控是最基本的东西,不过在初创公司很多计划是跟不上项目架构变化的,项目中会不断加入各种服务和组 ...
- lua的数据类型
Lua 是动态(弱)类型的语言,它有一下几种数据结构: nil(空) nil 类型表示一种没有任何有效值,它只有一个值 -- nil,例如打印一个没有赋值的变量,便会输出一个 nil 值: print ...
- inline元素、block元素
inline元素 不会独占一行,相邻的行内元素会排列在同一行内,直到一行排不下才会换行 高.行高.以及外边距和内边距不可改变 宽度就是它的文字或图片的宽度,不可改变,随元素内容变化而变化 内联元素只能 ...