关闭

hdu 6050 funny function

标签: 斐波那契
799人阅读 评论(4) 收藏 举报
分类:

F1,1=F1,2=1
F1,i=F1,i1+2F1,i2|i>=3
Fi,j=j+N1k=jFi1,k
给定N,M,求Fm,1

首先昨天先写了几个,发现Fi,j=Fi,j1+2Fi,j2也是成立的,于是就有下面的:
Fi,j+1Fi,j=2Fi,j1
Fi,jFi,j1=2Fi,j2

Fi,3Fi,2=2Fi,1
迭加得:
Fi,j+1Fi,2=2j1k=1Fi,k
Fi,j+1Fi,1=Fi,1+Fi,2+...+Fi,j1+A
这里
A=2Fi,2+Fi,3+...+Fi,j1
j+1为奇数时
A=Fi,j

Fi,j+1Fi,1=jk=1Fi,k
j+1为偶数时,
2Fi,j+Fi,j+1=Fi,j+2Fi,j+1+Fi,1Fi,2=k=jk=1Fi,k

n为偶数时
Fi,1=nk=1Fi1,k=Fi1,n+1Fi1,1

[Fi,j+1Fi,j]=[1120][Fi,jFi,j1]

Fi,1=Fi1,1AnB0 A,B0
Fm,1=F1,1(AnB0)m1

同理n为奇数时一样,
Fm,1=F1,1(AnB1)m1
其中,

A=[1120]

n偶数
B=[1001]

n奇数
B=[0121]

#include<cstdio> 
#include<cstring>
#include<iostream>
using namespace std;
typedef long long ll;
const ll P = 1000000007;
const int N=2;
ll n,m;

struct matrix{
    ll a[N][N];
    int row,col;
    matrix():row(N),col(N){memset(a,0,sizeof(a));}
    matrix(int x,int y):row(x),col(y){memset(a,0,sizeof(a));}
    ll* operator [] (int x){return a[x];}
    matrix operator * (matrix x){
        matrix tmp ;
        for (int i=0;i<=n+1;i++)
            for (int j=0;j<=n+1;j++){
                tmp[i][j]=0;
                for (int k=0;k<=n+1;k++)
                    tmp[i][j]=(tmp[i][j]+a[i][k]*x[k][j])%P;
            }
        return tmp;
    }   
    matrix operator - (matrix x){
        matrix tmp ;
        for (int i=0;i<=n+1;i++)
            for (int j=0;j<=n+1;j++){
                tmp[i][j]=a[i][j] - x[i][j] + P;
                tmp[i][j]%=P;
            }
        return tmp;
    }   
    void operator *= (matrix x){*this = *this * x;}
    matrix operator ^ (ll x){
        matrix ret;
        for (int i=0;i<=n+1;i++)ret[i][i]=1;
        matrix tmp = *this;
        for (;x;x>>=1,tmp*=tmp){if(x&1)ret *=tmp;}
        return ret;
    }
};

int main(){
    long long T,nn,mm;
    cin>>T;
    n=0;
    while(T--){
        scanf("%lld%lld",&nn,&mm);
        matrix A,B,ans;
        A[0][0]=1;A[0][1]=2;A[1][0]=1;A[1][1]=0;
        if(nn&1){
            B[0][0]=0;B[0][1]=2;
            B[1][0]=1;B[1][1]=-1;
        } else {
            B[0][0]=1;B[0][1]=0;
            B[1][0]=0;B[1][1]=1;
        }
        ans = ((A ^ nn) - B) ^ (mm-1);
        cout<<(ans[0][0])<<endl;
    }
    return 0;
}

然后用特征值算矩阵n次方,可以求得
Fm,1=(2n1)m123|n
Fm,1=(2n1)m12+13|n
除三要么用逆元,要么取模的时候先对3000000021取模,最后再对1000000007取模。
于是,

#include <cstdio>
#include <cstring>
#include <iostream>

using namespace std;

typedef long long ll;

const ll P = 3000000021LL;
const ll MOD = 1000000007;

ll pow(ll a,ll n){
    if(n==0) return 1LL;
    ll tmp = pow(a,n/2);
    if(n&1)
        return tmp*tmp%P*a%P;
    return tmp*tmp%P;
}

int main(){
    int T;
    ll n,m;
    cin>>T;
    while(T--){
        scanf("%lld%lld",&n,&m);
        ll t = pow(2LL,n);
        t = (t - 1) % P;
        t = pow(t,m-1);
        if(n&1) t = t * 2LL + 1;
        else t = t * 2LL;
        t /= 3LL;
        cout<<t%MOD<<endl;
    }
    return 0;
}
1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

(矩阵快速幂, 数学公式推导)HDU 6050 Funny Function

HDU-2017 多校训练赛2-1006-Funny Function题目网址: HDU 6050 Funny Function题解(BestCoder提供): 对于任意i>=1,当j>=3时,有 通...
  • VonSdite
  • VonSdite
  • 2017-07-27 18:41
  • 315

John+hdu+尼姆博弈

John Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Sub...
  • u012870383
  • u012870383
  • 2014-09-24 23:05
  • 586

(2017多校训练第二场)HDU - 6050 Funny Function 找规律 + 逆元

题目链接:点击打开链接 比赛的时候思路跑偏了,总是纠结于找第一行的每个元素对于答案的贡献,找了一个多小时然后放弃了。 暴力打表然后找规律。 因为存在除法取模的问题,所以要用到逆元。 代...
  • ECNU_LZJ
  • ECNU_LZJ
  • 2017-07-29 19:44
  • 239

2017多校联合第二场 1006题 hdu 6050 Funny Function 递推公式 / 矩阵快速幂

题目链接 题意: Problem Description Function Fx,ysatisfies: For given integers N and M,calculate Fm,...
  • kkkkahlua
  • kkkkahlua
  • 2017-07-28 17:39
  • 98

Funny Function————(hdu6050)矩阵快速幂

Problem Description Function Fx,ysatisfies: For given integers N and M,calculate Fm,1 modulo 1e9...
  • xiaohang3414
  • xiaohang3414
  • 2017-07-29 17:45
  • 107

获取6050原始数据

MPU6050的原始数据分析个人经验来讲,如果对IIC总线协议很熟悉的情况下,获取6050的原始数据就不是什么太大的难题,毕竟再怎么复杂也只是一个传感器而已,就像你打电话给传感器,要它的数据,然后它返...
  • ysudykx
  • ysudykx
  • 2017-03-31 11:01
  • 1833

Linux文件特殊权限

对Linux文件的一般权限,即rwx已经有些了解了,用数字表示分别为4,2,1。在学习Hadoop的LinuxTaskController时遇到了一些特殊权限的设置,虽然之前已经了解这些特殊权限,大体...
  • sky_walker85
  • sky_walker85
  • 2014-03-14 15:51
  • 3425

Arduino MPU6050学习资料总结

在学习MPU6050的过程中,看了一些相关资料,整理总结一下。
  • u010006102
  • u010006102
  • 2015-06-28 01:52
  • 5410

【HDU】6038 - Function(置换群)

题目链接:点击打开题目题意不是很好解释,但是看懂了能看出来是一个置换群。 我们先求b的各循环阶数数的个数,然后求a中每个群中,循环阶数的因子的元素的数量,就是可以作为fi的值的数的个数。比赛10发W...
  • wyg1997
  • wyg1997
  • 2017-07-26 08:50
  • 126

hdu6050 Funny Function【打表+找规律+矩阵快速幂】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6050 题意:看公式,求fm,1 解析:打表找规律 直接找答案的规律,根据题目的公式来推,太难了,...
  • Richie_ll
  • Richie_ll
  • 2017-07-27 21:11
  • 354
    个人资料
    • 访问:18895次
    • 积分:656
    • 等级:
    • 排名:千里之外
    • 原创:46篇
    • 转载:2篇
    • 译文:0篇
    • 评论:11条
    文章分类