题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6050

题意:题目很短自己看吧,

    就是这个递推式子,说的很清楚了,让你求F(m,1)。题解里面分什么奇偶性分别去算,有些人找规律找出来了,题解是非常严谨的用数学推出来了(反正没有看懂),虽然也用到了矩阵快速幂。

思路:拿到这个题,我第一反应也是矩阵快速幂,然后手推了第二行,我发现第二行依旧满足上面F(2,i)=F(2,i-1)+2*F(2,i-2)这个性质。所以我就萌生一个想法,我先把一行算出来,然后把他转换成下一行。问题是如何在行与行之间转换,我们发现每一行的第一个等于上一个行1到n每一项之和,每一行的第二个,需要2到n+1每一项之和。那么我直接算出前n+1项的和Sn+1,Sn+1-Fn+1=N1,Sn+1-F1=N2。如此我们就得到了下一行的前两个。然后我们有可以同理求出再下一行。这个矩阵比较难构造,具体的矩阵是4*4的,为了说明方便,我在代码直接每一项赋值,可以把他们抄出来看看是否是这么一个回事,构造矩阵可能是一个难点,我做了挺多矩阵快速幂的题,有一些小经验,以后可能会写出来分享一下。

代码:

 //Author: xiaowuga
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <queue>
#include <cmath>
#include <cstring>
#include <cstdio>
#include <ctime>
#include <map>
#include <bitset>
#include <cctype>
#define maxx INT_MAX
#define minn INT_MIN
#define inf 0x3f3f3f3f
#define mem(s,ch) memset(s,ch,sizeof(s))
#define da cout<<da<<endl
#define uoutput(a,i,l,r) for(int i=l;i<r;i++) if(i==l) cout<<a[i];else cout<<" "<<a[i];cout<<endl;
#define doutput(a,i,l,r) for(int i=r-1;i>=0;i--) if(i==r-1) cout<<a[i];else cout<<" "<<a[i];cout<<endl;
const long long N=;
const long long mod=1e9+;
using namespace std;
typedef long long LL;
struct Matrix{
LL mat[N][N] = {{}};
void clear(){
memset(mat,,sizeof(mat));
}
Matrix operator * (const Matrix & m) const{
Matrix tmp;
for(int i=;i<N;i++)
for(int k=;k<N;k++){
if (mat[i][k]) {
for(int j=;j<N;j++){
tmp.mat[i][j]+=mat[i][k]*m.mat[k][j]%mod;
tmp.mat[i][j]%=mod;
}
}
}
return tmp;
}
};
Matrix POW(Matrix m,LL k){
Matrix ans;
ans.clear();
for(int i=;i<N;i++) ans.mat[i][i]=;
while(k){
if(k&) ans=ans*m;
k/=;
m=m*m;
}
return ans;
}
Matrix xx,yy;
void init(){
xx.mat[][]=; xx.mat[][]=; xx.mat[][]=; xx.mat[][]=;
xx.mat[][]=; xx.mat[][]=; xx.mat[][]=; xx.mat[][]=;
xx.mat[][]=; xx.mat[][]=; xx.mat[][]=; xx.mat[][]=;
xx.mat[][]=; xx.mat[][]=; xx.mat[][]=; xx.mat[][]=; yy.mat[][]=; yy.mat[][]=; yy.mat[][]=; yy.mat[][]=mod-;
yy.mat[][]=mod-; yy.mat[][]=; yy.mat[][]=; yy.mat[][]=;
yy.mat[][]=mod-; yy.mat[][]=; yy.mat[][]=; yy.mat[][]=mod-;
yy.mat[][]=mod-; yy.mat[][]=; yy.mat[][]=; yy.mat[][]=;
}
LL n,mm;
int main() {
init();
int T;
scanf("%lld",&T);
while(T--){
scanf("%lld%lld",&n,&mm);
if(n==||mm==) {cout<<<<"\n";continue;}
Matrix ans1=POW(xx,n-);
Matrix ans2=ans1*yy;
Matrix ans3=POW(ans2,mm);
LL f[]={,,,};
LL a[]={};
for(int i=;i<;i++){
for(int j=;j<;j++){
a[i]+=ans3.mat[i][j]*f[j]%mod;
a[i]%=mod;
}
}
cout<<a[]<<"\n";
}
return ;
}

2017 Multi-University Training Contest - Team 2——HDU6050 Funny Function的更多相关文章

  1. 2017 Multi-University Training Contest - Team 9 1005&&HDU 6165 FFF at Valentine【强联通缩点+拓扑排序】

    FFF at Valentine Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  2. 2017 Multi-University Training Contest - Team 9 1004&&HDU 6164 Dying Light【数学+模拟】

    Dying Light Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Tot ...

  3. 2017 Multi-University Training Contest - Team 9 1003&&HDU 6163 CSGO【计算几何】

    CSGO Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

  4. 2017 Multi-University Training Contest - Team 9 1002&&HDU 6162 Ch’s gift【树链部分+线段树】

    Ch’s gift Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  5. 2017 Multi-University Training Contest - Team 9 1001&&HDU 6161 Big binary tree【树形dp+hash】

    Big binary tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  6. 2017 Multi-University Training Contest - Team 1 1003&&HDU 6035 Colorful Tree【树形dp】

    Colorful Tree Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

  7. 2017 Multi-University Training Contest - Team 1 1006&&HDU 6038 Function【DFS+数论】

    Function Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total ...

  8. 2017 Multi-University Training Contest - Team 1 1002&&HDU 6034 Balala Power!【字符串,贪心+排序】

    Balala Power! Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

  9. 2017 Multi-University Training Contest - Team 1 1011&&HDU 6043 KazaQ's Socks【规律题,数学,水】

    KazaQ's Socks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

随机推荐

  1. 每日英语:Yahoo's Rally: Made in China

    The typical honeymoon doesn't last too long before the hard work of marriage begins. And so it norma ...

  2. maven中配置jdk版本

    1 maven 中配置 <build> <plugins> <plugin> <groupId>org.apache.maven.plugins< ...

  3. AIX中查找端口号和进程

    1.由端口号查找进程 维护系统或检查到不明的端口自然要去查一下这个端口是由哪个进程来监听的windows可以用命令netstat -ano来查端口对应的进程的pid. aix却并不能,aix需要使用下 ...

  4. 这不是bug,而是语言特性

    分析编程语言缺陷的一种方法是把所有的缺陷归于3类:不该做的做了,该做的没做,该做但做得不合适. 在使用switch case时,如果使用缺省的 fall through,请一定在旁边注释,因为97%的 ...

  5. Python操作Word【批量生成文章】

    http://www.cnblogs.com/codex/p/4668396.html 需要做一些会议记录.总共有多少呢?五个地点x7个月份x每月4篇=140篇.虽然不很重要,但是140篇记录完全雷同 ...

  6. lua文件读写

    lua里的文件读写模型来自C语言,分为完整模型(和C一样).简单模型. 1.简单模型 io.input([file])  设置默认的输入文件,file为文件名(此时会以文本读入)或文件句柄(可以理解为 ...

  7. [未解决]Exception in thread "main" java.lang.IllegalArgumentException: offset (0) + length (8) exceed the capacity of the array: 6

    调用这个方法 是报错,未解决 binfo.setTradeAmount(Double.parseDouble(new String(result.getValue(Bytes.toBytes(fami ...

  8. 计算机网络——OSI、TCP/IP协议族详解

    一.OSI七层协议体系结构域TCP/IP四层体系结构对比 ISO/OSI模型,即开放式通信系统互联参考模型(Open System Interconnection Reference Model),是 ...

  9. [初学WPF]控件大小自适应

    想在Win上自己写点小工具用,GUI自然是免不了的,于是决定学一学WPF,直接拖控件是很方便啊.控件拖出来以后发现运行时改变窗口大小控件不会重绘,搜索了一下发现了解决办法:使用Viewbox控件. V ...

  10. VMware12激活码,win10激活码

    VMware Workstation 12序列号: 5A02H-AU243-TZJ49-GTC7K-3C61N win10激活码:这里在网上搜集到很多激活码,可能有的不能用.   WRUF7-AFI0 ...