Recursive sequence (矩阵快速幂)2016ACM/ICPC亚洲区沈阳站
题目
Farmer John likes to play mathematics games with his N cows. Recently, they are attracted by recursive sequences. In each turn, the cows would stand in a line, while John writes two positive numbers a and b on a blackboard. And then, the cows would say their identity number one by one. The first cow says the first number a and the second says the second number bb. After that, the ii-th cow says the sum of twice the (i−2)-th number, the (i−1)-th number, and i^4. Now, you need to write a program to calculate the number of the N-th cow in order to check if John’s cows can make it right.
Input
The first line of input contains an integer t, the number of test cases. tt test cases follow.
Each case contains only one line with three numbers N, aa and bb where N,a,b<2^31 as described above.
Output
For each test case, output the number of the NN-th cow. This number might be very large, so you need to output it modulo 2147493647.
In the first case, the third number is $85 = 21+2+3^4.Inthesecondcase,thethirdnumberis.Inthesecondcase,thethirdnumberis93 = 21+1*10+3^4andthefourthnumberisandthefourthnumberis369 = 2 * 10 + 93 + 4^4$.
题意
题目给出这样一个递推公式:
f(n)=f(n-2)*2+f(n-1)+n^ 4
f(1)=a,
f(2)=b;
给出n,a,b求f(n)%2147493647;
根据递推公式容易得出一个O(N)的暴力算法。但这题的数据范围为N,a,b<2^31 ,直接暴力肯定超时,要用O(1),O(lngn)或者是O(n^(1/2))的算法才有可能ac
观察这种递推公式,发现我们可以使用矩阵快速幂来计算,矩阵快速幂的复杂度是O(m^3 *lngn)m是矩阵的大小,复杂度很小可以一试。
矩阵快速幂是定义一个状态矩阵和一个转移矩阵,前一个状态矩阵乘转移矩阵可得到后一个状态矩阵。
这题和普通的矩阵快速幂有点区别,这题的递推函数在混合了一个变量n^4。
所以我们这题首先要考虑的就是,如何从n^4推出(n+1)^4,我们发现通过二项式定理可以得出,(n+1)^4=n^4+4n^3+6n^2+4n+1
这样就有f(n+1)=2*f(n-1)+f(n)+n^4+4n^3+6n^2+4n+1
不妨设状态矩阵F(n-1)=[f(n-1),f(n),n^4,4n^3,6n^2,4n,1]
若F(n)=F(N-1)*A 即[f(n),f(n+1),(n+1)^4,4(n+1)^3,6(n+1)^2,4(n+1),1]=[f(n-1),f(n),n^4,4n^3,6n^2,4n,1]*A
计算得A=
{0,2,0,0,0,0,0}
{1,1,0,0,0,0,0}
{0,1,1,0,0,0,0}
{0,1,1,1,0,0,0}
{0,1,1,2,1,0,0}
{0,1,1,3,3,1,0}
{0,1,1,4,6,4,1}
AC代码
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<set>
using namespace std;
typedef long long ll;
const ll mod=2147493647;
ll n; void mul(ll f[7],ll a[7][7]){
ll c[7];
memset(c,0,sizeof(c));
for(ll j=0;j<7;j++)
for(ll k=0;k<7;k++)
c[j]=(c[j]+(ll)f[k]*a[k][j])%mod;
memcpy(f,c,sizeof(c));
} void mulself(ll a[7][7]){
ll c[7][7];
memset(c,0,sizeof(c));
for(ll i=0;i<7;i++)
for(ll j=0;j<7;j++)
for(ll k=0;k<7;k++)
c[i][j]=(c[i][j]+(ll)a[i][k]*a[k][j])%mod;
memcpy(a,c,sizeof(c)); } int main(){
ll t,a,b;
scanf("%lld",&t);
while(t--){
scanf("%lld%lld%lld",&n,&a,&b);
ll f[]={a,b,16,32,24,8,1};
ll a[][7]={
{0,2,0,0,0,0,0},
{1,1,0,0,0,0,0},
{0,1,1,0,0,0,0},
{0,1,1,1,0,0,0},
{0,1,1,2,1,0,0},
{0,1,1,3,3,1,0},
{0,1,1,4,6,4,1},
};
n--;
for(;n;n>>=1){
if(n&1)mul(f,a);
mulself(a);
}
printf("%lld\n",f[0]); } }
Recursive sequence (矩阵快速幂)2016ACM/ICPC亚洲区沈阳站的更多相关文章
- HDU 5950 Recursive sequence 【递推+矩阵快速幂】 (2016ACM/ICPC亚洲区沈阳站)
Recursive sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- HDU5950 Recursive sequence —— 矩阵快速幂
题目链接:https://vjudge.net/problem/HDU-5950 Recursive sequence Time Limit: 2000/1000 MS (Java/Others) ...
- hdu 5950 Recursive sequence 矩阵快速幂
Recursive sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- HDU5950 Recursive sequence (矩阵快速幂)
Recursive sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- 2016ACM/ICPC亚洲区沈阳站 - A/B/C/E/G/H/I - (Undone)
链接:传送门 A - Thickest Burger - [签到水题] ACM ICPC is launching a thick burger. The thickness (or the heig ...
- HDU 5952 Counting Cliques 【DFS+剪枝】 (2016ACM/ICPC亚洲区沈阳站)
Counting Cliques Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- HDU 5948 Thickest Burger 【模拟】 (2016ACM/ICPC亚洲区沈阳站)
Thickest Burger Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- HDU 5949 Relative atomic mass 【模拟】 (2016ACM/ICPC亚洲区沈阳站)
Relative atomic mass Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- HDU 5950 - Recursive sequence - [矩阵快速幂加速递推][2016ACM/ICPC亚洲区沈阳站 Problem C]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5950 Farmer John likes to play mathematics games with ...
随机推荐
- Mac OSX上安装Nginx
1. 通过brew instal nginx安装 ==> Downloading https://homebrew.bintray.com/bottles/nginx-1.10.1.el_cap ...
- Stone(思维)
链接:https://ac.nowcoder.com/acm/contest/893/D来源:牛客网 题目描述 有n堆石子排成一排,第i堆石子有aiai个石子. 每次,你可以选择任意相邻的两堆石子进行 ...
- 1090 Highest Price in Supply Chain (25 分)(模拟建树,找树的深度)牛客网过,pat没过
A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyone invo ...
- C006:多项式求值 horner法则
代码: #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { float x; do{ printf("E ...
- 【Oracle】SQL对某字段模糊查询,哪种方案最快?
问题:有一张表hy_test,查找其字段name中包含ufo的记录数,下面哪种方案最快? A.select count(*) from hy_test where name like '%ufo%' ...
- SEDA架构实现
一.SEDA SEDA全称是:stage event driver architecture,中文直译为“分阶段的事件驱动架构”,它旨在结合事件驱动和多线程模式两者的优点,从而做到易扩展,解耦合,高并 ...
- windows软件介绍
基础软件 txt 阅读 NotePad++,方便阅读代码,支持列复制. 全局搜索 Everything 截图 Snipaste 读取图片 Picase.PureRef 其他 置顶窗口 DeskPins ...
- [极客大挑战 2019]Havefun wp
很少见的很简单的一道题 查看源代码 获得一段被注释的代码 直接?cat=dog即可得flag
- Dubbo必须会的知识点
前言 应用架构演变: 单一架构ORM:单机构建网站,是一个高内聚版本,所有功能部署在一起.通过一个容器和JSP/Servlet技术或通过一些开源的框架如SSM以及SSH,通过数据库管理系统来存储数据. ...
- Promise场景实例之图片加载
所有图片加载完再添加到页面 { // 所有图片加载完再添加到页面 function loadImg(src) { return new Promise(function (resolve, rejec ...