zoukankan      html  css  js  c++  java
  • codeforces 450B B. Jzzhu and Sequences(矩阵快速幂)

    题目链接:

    B. Jzzhu and Sequences

    time limit per test
    1 second
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    Jzzhu has invented a kind of sequences, they meet the following property:

    You are given x and y, please calculate fn modulo 1000000007 (109 + 7).

    Input

    The first line contains two integers x and y (|x|, |y| ≤ 109). The second line contains a single integer n (1 ≤ n ≤ 2·109).

    Output

    Output a single integer representing fn modulo 1000000007 (109 + 7).

    Examples
     
    input
    2 3
    3
    output
    1
    input
    0 -1
    2
    output
    1000000006
    Note

    In the first sample, f2 = f1 + f3, 3 = 2 + f3, f3 = 1.

    In the second sample, f2 =  - 1;  - 1 modulo (10^9 + 7) equals (10^9 + 6).

    题意:

    水题,不行说;

    思路:

    矩阵快速幂的水题;

    AC代码:

    #include <bits/stdc++.h>
    using namespace std;
    const int N=1e4+6;
    typedef long long ll;
    const ll mod=1e9+7;
    ll n,x,y;
    struct matrix
    {
        ll a[2][2];
    };
    matrix mul(matrix A,matrix B)
    {
        matrix s;
        s.a[0][0]=s.a[1][1]=0;
        s.a[0][1]=s.a[1][0]=0;
        for(int i=0;i<2;i++)
        {
            for(int j=0;j<2;j++)
            {
                s.a[i][j]=0;
                for(int k=0;k<2;k++)
                {
                    s.a[i][j]+=A.a[i][k]*B.a[k][j];
                    s.a[i][j]%=mod;
                }
            }
        }
        return s;
    }
    ll fast_pow(matrix A,ll num)
    {
        matrix s,base;
        for(int i=0;i<2;i++)
        {
            for(int j=0;j<2;j++)
            {
                s.a[i][j]=(i==j);
                base.a[i][j]=A.a[i][j];
            }
        }
    
        while(num)
        {
            if(num&1)
            {
                s=mul(s,base);
            }
            base=mul(base,base);
            num=(num>>1);
        }
        return (s.a[0][0]*y%mod+s.a[0][1]*x%mod)%mod;
    
    }
    
    int main()
    {
        cin>>x>>y;
        cin>>n;
        matrix ma;
        ma.a[0][0]=ma.a[1][0]=1;
        ma.a[0][1]=-1;
        ma.a[1][1]=0;
        if(n>2)cout<<(fast_pow(ma,n-2)%mod+mod)%mod<<"
    ";
        else if(n==2)cout<<(y%mod+mod)%mod<<"
    ";
        else cout<<(x%mod+mod)%mod<<"
    ";
    
    }
  • 相关阅读:
    Java中last_insert_id的使用
    Java上传视频
    Java创建Excel-DEMO
    导出excel表格
    Java导入excel并保存到数据库
    Java基础13一异常
    Java基础12一IO流
    腾讯云-等保要求
    云安全等保项目服务内容及云安全产品清单-(腾讯云部分)
    《网络风险及网络安全》培训总结
  • 原文地址:https://www.cnblogs.com/zhangchengc919/p/5410669.html
Copyright © 2011-2022 走看看