码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 4990 Reading comprehension (找规律+矩阵快速幂)

时间:2014-09-08 09:39:46      阅读:283      评论:0      收藏:0      [点我收藏+]

标签:bestcode   hdu   矩阵快速幂   找规律   

题目链接:HDU 4990 Reading comprehension

题目给的一个程序其实就是一个公式:当N=1时 f[n]=1,当n>1时,n为奇数f[n]=2*f[n-1]+1,n为偶数f[n]=2*f[n-1]。

先不取模,计算前十个找规律。得到一个递推公式:f[n]=2*f[n-2]+f[n-1]+1

然后快速幂解决之。

给出一个神奇的网站(找数列通项):http://oeis.org/


AC代码:


#include<stdio.h>
#include<string.h>
#include<iostream>
#define ll __int64
struct Matrix
{
    ll m[10][10];
};
struct Matrix I,s;
ll n,kmod;

Matrix Mul(Matrix a,Matrix b)
{
    Matrix c;
    ll i,j,k;
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            c.m[i][j]=0;
            for(k=0;k<3;k++)
            {
                c.m[i][j]+=(a.m[i][k]*b.m[k][j]);
                c.m[i][j]%=kmod;
            }
        }
    }
    return c;
}

Matrix Quickpow(Matrix a,ll n)
{
    Matrix m,b;
    m=a,b=I;
    while(n)
    {
        if(n%2)
            b=Mul(b,m);
        n/=2;
        m=Mul(m,m);
    }
    return b;
}

int main()
{
    ll i,j;
    ll k,a,b;
    while(scanf("%I64d %I64d",&n,&kmod)!=EOF)
    {
        Matrix ans,p,q;
        memset(I.m,0,sizeof I.m);
        memset(p.m,0,sizeof p.m);
        memset(q.m,0,sizeof q.m);
        for(i=0;i<3;i++)
            I.m[i][i]=1;
        q.m[0][0]=1;
        q.m[0][1]=2;
        q.m[0][2]=1;

        p.m[1][0]=1;
        p.m[0][1]=2;
        p.m[1][1]=1;
        p.m[2][1]=1;
        p.m[2][2]=1;
        if(n==1)
            printf("%I64d\n",1%kmod);
        else if(n==2)
            printf("%I64d\n",2%kmod);
        else
        {
            ans=Quickpow(p,n-2);
            ans=Mul(q,ans);
            printf("%I64d\n",ans.m[0][1]%kmod);
        }
    }

    return 0;
}


HDU 4990 Reading comprehension (找规律+矩阵快速幂)

标签:bestcode   hdu   矩阵快速幂   找规律   

原文地址:http://blog.csdn.net/u012377575/article/details/39124145

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!