题目

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亚洲区沈阳站的更多相关文章

  1. HDU 5950 Recursive sequence 【递推+矩阵快速幂】 (2016ACM/ICPC亚洲区沈阳站)

    Recursive sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  2. HDU5950 Recursive sequence —— 矩阵快速幂

    题目链接:https://vjudge.net/problem/HDU-5950 Recursive sequence Time Limit: 2000/1000 MS (Java/Others)   ...

  3. hdu 5950 Recursive sequence 矩阵快速幂

    Recursive sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  4. HDU5950 Recursive sequence (矩阵快速幂)

    Recursive sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

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

  6. HDU 5952 Counting Cliques 【DFS+剪枝】 (2016ACM/ICPC亚洲区沈阳站)

    Counting Cliques Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  7. HDU 5948 Thickest Burger 【模拟】 (2016ACM/ICPC亚洲区沈阳站)

    Thickest Burger Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  8. HDU 5949 Relative atomic mass 【模拟】 (2016ACM/ICPC亚洲区沈阳站)

    Relative atomic mass Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...

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

随机推荐

  1. 复杂一点的SQL语句:Oracle DDL和DML

    DDL:对表或者表的属性进行了改变 create:创建表创建用户创建视图 创建表 create table student(id int,score int) ; student后面与括号之间可以有空 ...

  2. node.js的安装及其相关环境变量的配置

    笔者最近一直重置电脑,本来想换台mac,想了想还是加下配置吧. 于是慢慢的一直会去安装node 接下来进入教程环节 一.NodeJS下载 1.下载NodeJS安装包下载地址:NodeJS下载 2.开始 ...

  3. T4m

    Unity T4M 中文讲解 http://blog.csdn.net/tianmao111/article/details/46482963

  4. 2020年的UWP——通过Radio类控制Cellular(1)

    最近在做UWP的项目,在2020年相信这已经是相对小众的技术了,但是在学习的过程中,发现某软这么几年仍然添加了不少的API,开放了相当多的权限.所以打算总结一下最近的一些经验和收获,介绍一下2020年 ...

  5. iptables实用知识 ,一文学会配置linux防火墙

    目录 1.防火墙的概念 2. linux防火墙 3.linux数据包处理流程 3.1 linux 防火墙将以上流程,固定区分为5个流程节点 3.2 数据流程 4 linux防火墙的实现机制 4.1 i ...

  6. String.format与搭配转化符的使用

    String的format语法搭配转化符,在格式化输出方面效果特别好,值得掌握. 例程: System.out.println("----C1---|----C2---|----C3---| ...

  7. maoge数

    maoge数 题目描述 maoge定义一个数x是maoge数的条件,当且仅当x的各数位之和等于 x / 2向下取整,现在maoge想让你求 n 的约数中有多少个maoge数 输入格式 输入一个数 n ...

  8. [剑指Offer]17-打印从1到最大的n位数(递归)

    题目 如题,输入n,则从1打印至99. 题解 考虑到n比较大会有大数问题,所以使用字符数组存储数. 由题可用递归求n位全排列,即为所得. 具体地,用临时字符数组用来存答案,每次递归填好一位,都填好后输 ...

  9. [程序员代码面试指南]栈和队列-最大值减去最小值 小于或等于num 的子数组的数量(单调队列)

    题目 给定数组arr和整数num,求数组的子数组中有多少个的满足"最大值减去最小值<=num". 解题思路 分析题目,有结论: 如果数组arr[i...j]满足条件,则它的每 ...

  10. WeihanLi.Npoi 1.10.0 更新日志

    WeihanLi.Npoi 1.10.0 更新日志 Intro 上周有个网友希望能够导入Excel时提供一个 EndRowIndex 来自己控制结束行和根据字段过滤的,周末找时间做了一下这个 feat ...