HDU4565-So easy-数学推导化简递推矩阵快速幂

原创 2016年04月07日 20:30:08

So Easy!

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3517    Accepted Submission(s): 1136


Problem Description
  A sequence Sn is defined as:

Where a, b, n, m are positive integers.┌x┐is the ceil of x. For example, ┌3.14┐=4. You are to calculate Sn.
  You, a top coder, say: So easy! 
 

Input
  There are several test cases, each test case in one line contains four positive integers: a, b, n, m. Where 0< a, m < 215, (a-1)2< b < a2, 0 < b, n < 231.The input will finish with the end of file.
 

Output
  For each the case, output an integer Sn.
 

Sample Input
2 3 1 2013 2 3 2 2013 2 2 1 2013
 

Sample Output
4 14 4
 
题意:就是求出题中给出的数的值。




代码如下:
#include<bits/stdc++.h>
using namespace std;
long long a,b,n,m;
struct mat {
    long long a[2][2];
};
mat mul(mat x,mat y) {
    mat tt;
    for(int i=0;i<=1;i++)
        for(int j=0;j<=1;j++) {
            tt.a[i][j]=0;
            for(int k=0;k<=1;k++)
                tt.a[i][j]+=x.a[i][k]*y.a[k][j];
            tt.a[i][j]%=m;
        }
    return tt;
}
int main()
{
    while(scanf("%I64d%I64d%I64d%I64d",&a,&b,&n,&m)!=EOF) {
        long long f0=2;long long f1=2*a;
        if(n==0) {
            printf("%lld\n",f0);
            continue;
        }
        if(n==1) {
            printf("%lld\n",f1);
            continue;
        }
        mat base,ans;
        ans.a[0][0]=ans.a[1][1]=1;
        ans.a[1][0]=ans.a[0][1]=0;
        base.a[0][0]=((2*a)%m+m)%m;
        base.a[0][1]=((b-a*a)%m+m)%m;
        base.a[1][0]=1;
        base.a[1][1]=0;
        long long x=n-1;
       // cout << x << endl;
        while(x) {
            if(x&1) {
                ans=mul(ans,base);
            }
            base=mul(base,base);
            x/=2;
        }
        long long tot=(ans.a[0][0]*f1+ans.a[0][1]*f0)%m;
        printf("%lld\n",tot);
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

NYOJ 301 递推求值(矩阵快速幂)

递推求值 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 给你一个递推公式: f(x)=a*f(x-2)+b*f(x-1)+c 并给你f(1),f(2)的...
  • LYHVOYAGE
  • LYHVOYAGE
  • 2014年04月04日 12:25
  • 3143

【专题】—【数学】—【矩阵快速幂】

参考文章: http://blog.csdn.net/shiwei408/article/details/8818386
  • u013795055
  • u013795055
  • 2014年08月16日 00:20
  • 2157

矩阵快速幂专题(一)

最近闲来无事,准备集中精力刷一波数论与图论。矩阵快速幂是数论里面的重要组成部分,值得我好好学习一下。因为题目比较多,分析也比较多,所以将此专题分成几个部分。做完这一专题,可能会暂时转向图论部分,然后等...
  • shengtao96
  • shengtao96
  • 2016年03月25日 22:45
  • 1058

根据递推公式构造系数矩阵用于快速幂

简单的例子FibonacciFibonacci数列考虑FibonacciFibonacci数列, F(n)=F(n−1)+F(n−2)F(n)=F(n-1)+F(n-2) 将右边两项看做是一个列向...
  • u012061345
  • u012061345
  • 2016年08月16日 21:51
  • 901

矩阵快速幂总结

矩阵快速幂 基础知识:(会基础的直接看应用部分) (1) 矩阵乘法 简单的说矩阵就是二维数组,数存在里面,矩阵乘法的规则:A*B=C 其中c[i][j]为A的第i行与B的第j列对应乘积的和,即: ...
  • wust_zzwh
  • wust_zzwh
  • 2016年11月25日 15:40
  • 8073

算法学习 - 快速幂和矩阵快速幂(复杂度Olog(n))C++实现

快速幂 快速幂顾名思义,就是快速算某个数的多少次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。 快速幂实现原理 快速幂的原理比较好懂,就是说假如我们...
  • chenfs1992
  • chenfs1992
  • 2014年12月24日 22:51
  • 7732

POJ3070矩阵快速幂求Fib

欲哭无泪。。。。。比赛的时候都敲不出来。。 Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Tota...
  • u012350533
  • u012350533
  • 2013年10月08日 23:50
  • 931

快速幂或者矩阵快速幂

快速幂或者矩阵快速幂在算指数时是很高效的,他的基本原理是二进制,下面的A可以是一个数也可以是一个矩阵(本文特指方阵),若是数就是快速幂算法,若是矩阵就是矩阵快速幂算法,用c++只需把矩阵设成一个类就可...
  • u011401504
  • u011401504
  • 2013年08月04日 22:17
  • 10070

java实现矩阵快速幂算法

java实现矩阵快速幂算法
  • y937498174
  • y937498174
  • 2015年04月24日 09:53
  • 1121

一类常见的矩阵快速幂题型 总结

Googlecode jam 2008 Round 1A(c.Numbers) 【题意】计算的小数点前三位数,不足三位补0,正整数n的最大值为20亿。 【前提】:满足 的值在【0,1】范围 首...
  • u013050857
  • u013050857
  • 2015年09月21日 23:59
  • 1028
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU4565-So easy-数学推导化简递推矩阵快速幂
举报原因:
原因补充:

(最多只允许输入30个字)