zoukankan      html  css  js  c++  java
  • 1643【例 3】Fibonacci 前 n 项和

    1643:【例 3】Fibonacci 前 n 项和

    时间限制: 1000 ms         内存限制: 524288 KB

    sol:这题应该挺水的吧,就像个板子一样

                  1 0 0
    1 1 0   *  1 1 1        (第一位是到i的和,第二位是fi-1,第三位是fi-2),每次乘右边这个矩阵就是转移一次

                  1 1  0

    /*
    1 0 0
    1 1 1
    1 1 0
    */
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    inline ll read()
    {
        ll s=0;
        bool f=0;
        char ch=' ';
        while(!isdigit(ch))
        {
            f|=(ch=='-'); ch=getchar();
        }
        while(isdigit(ch))
        {
            s=(s<<3)+(s<<1)+(ch^48); ch=getchar();
        }
        return (f)?(-s):(s);
    }
    #define R(x) x=read()
    inline void write(ll x)
    {
        if(x<0)
        {
            putchar('-'); x=-x;
        }
        if(x<10)
        {
            putchar(x+'0');    return;
        }
        write(x/10);
        putchar((x%10)+'0');
        return;
    }
    #define W(x) write(x),putchar(' ')
    #define Wl(x) write(x),putchar('
    ')
    int n;
    ll Mod;
    ll power[5][5],a[5][5],c[5][5];
    ll ans[5][5];
    inline void Ad(ll &x,ll y)
    {
        x+=y;
        x-=(x>=Mod)?Mod:0;
        return;
    }
    int main()
    {
        int i,j,k;
        n=read()-1; R(Mod);
        ans[1][1]=ans[1][2]=1;
        a[1][1]=a[2][1]=a[2][2]=a[2][3]=a[3][1]=a[3][2]=1;
        for(i=1;i<=3;i++) power[i][i]=1;
        while(n)
        {
            if(n&1)
            {
                memset(c,0,sizeof c);
                for(i=1;i<=3;i++) for(j=1;j<=3;j++) for(k=1;k<=3;k++)
                {
                    Ad(c[i][j],power[i][k]*a[k][j]%Mod);
                }
                memmove(power,c,sizeof power);
            }
            memset(c,0,sizeof c);
            for(i=1;i<=3;i++) for(j=1;j<=3;j++) for(k=1;k<=3;k++)
            {
                Ad(c[i][j],a[i][k]*a[k][j]%Mod);
            }
            memmove(a,c,sizeof a);
            n>>=1;
        }
        memset(c,0,sizeof c);
        for(i=1;i<=1;i++) for(j=1;j<=3;j++) for(k=1;k<=3;k++)
        {
            Ad(c[i][j],ans[i][k]*power[k][j]%Mod);
        }
        memmove(ans,c,sizeof ans);
        Wl(ans[1][1]);
        return 0;
    }
    /*
    input
    5 1000
    output
    12
    
    hint
    1 1 2 3 5 8
    */
    View Code
  • 相关阅读:
    MSN无法登录(错误代码80072745)的解决方法
    C#3.0新体验(二) 扩展方法
    My DreamTech
    让IE崩溃的bug, IE8也一样崩溃
    多线程的相关概念
    10条PHP经验总结
    PHP框架 CI与TP之MVC比较
    多线程设计要点
    Linux yum命令的使用技巧
    BigPipe 的工作原理
  • 原文地址:https://www.cnblogs.com/gaojunonly1/p/10503641.html
Copyright © 2011-2022 走看看