51nod - 1573 分解 - 矩阵快速幂

原创 2016年08月31日 14:01:10

51nod 算法马拉松17(告别奥运)B 分解 51nod 算法马拉松17(告别奥运)B 分解
题意 :给出一个n,问(1+2)n 能否拆成m+m1 的形式,如果能,输出m,否则输出 no。

想法
观察(1+2)n,它总能写成a+b2的形式,如果a2n=m2b2n=m1 或者a2n=m12b2n=m,那就可以了。 于是我们设(1+2)n=an+bn2,不难找到(anbn)=(a1b1)(1211)n1

#include<bits/stdc++.h>
using namespace std;
const int maxn = 105;
const int mod = 1e9 + 7;
int t = 2;
struct mat
{
    long long v[maxn][maxn];
    int n;
    void clear()
    {
        n = t;
        memset(v, 0, sizeof(v));
    }
    void unit()
    {
        clear();
        for(int i=0; i<n; i++)
            v[i][i] = 1;
    }
    void fro()
    {
        clear();
        v[0][1] = v[1][0] = v[1][1] = 1;
    }
    void print()
    {
        for(int i=0; i<n; i++)
        {
            cout << v[i][0];
            for(int j=1; j<n; j++)
                cout << " " << v[i][j];
            cout << endl;
        }
    }

};
mat operator * (const mat a, const mat b)
{
    mat res;
    res.clear();
    for(int i=0; i<t; i++)
    {
        for(int j=0; j<t; j++)
        {
            for(int k=0; k<t; k++)
            {
                res.v[i][j] = (res.v[i][j] + a.v[i][k] * b.v[k][j]) % mod;
            }
        }
    }
    return res;
}
mat operator ^ (mat a, long long b)
{
    mat r , base = a;
    r.unit();
    while(b)
    {
        if(b&1)
            r = r * base;
        base = base * base;
        b >>= 1;
    }
    return r;
}
int main()
{
    long long m;
    mat a;
    a.clear();
    a.v[0][0] = 1, a.v[0][1] = 1;
    a.v[1][0] = 2, a.v[1][1] = 1;
    cin >> m;
    if(m == 0) {
        cout << 1 << endl; return 0;
    } else if(m == 1) {
        cout << 2 << endl; return 0;
    }
    a = (a^(m-1));
    long long t = a.v[0][0] + a.v[1][0];
    long long s = a.v[0][1] + a.v[1][1];
    long long tm = (t % mod) * (t % mod) % mod;
    long long sm = ((s % mod) * (s % mod) * 2 + 1 )% mod;
    long long ms = ((s % mod) * (s % mod) * 2 - 1 + mod)% mod;
    if(tm == sm)
        cout << tm << endl;
    else if(tm == ms)
        cout << (tm + 1 + mod) % mod << endl;
    else
        cout << "no" << endl;
    return 0;
}
版权声明:转载时记得附上原文链接哦~ 举报

相关文章推荐

51nod - 1573 分解 - 矩阵快速幂

51nod 算法马拉松17(告别奥运)B 分解 51nod 算法马拉松17(告别奥运)B 分解 题意 :给出一个nn,问(1+2√)n(1+\sqrt 2)^n 能否拆成m−−√+(√m−1)\sq...

51nod 1113 矩阵快速幂

给出一个N * N的矩阵,其中的元素均为正整数。求这个矩阵的M次方。由于M次方的计算结果太大,只需要输出每个元素Mod (10^9 + 7)的结果。 Input 第1行:2个数N和M,中间用空格分隔。...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

矩阵快速幂 51nod

基准时间限制:3 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 给出一个N * N的矩阵,其中的元素均为正整数。求这个矩阵的M次方。由于M次方的计算结果太大,只需要...

51nod--1113 矩阵快速幂

1113 矩阵快速幂基准时间限制:3 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 给出一个N * N的矩阵,其中的元素均为正整数。求这个矩阵的M次方。由于M次方的...

51Nod-1113-矩阵快速幂

ACM模版描述题解模版题,矩阵快速幂,很直白的一道题。需要好好研究一下矩阵的知识了……代码#include using namespace std;#define MAXN 111 #define m...
  • f_zyj
  • f_zyj
  • 2016-08-13 22:50
  • 278

51NOD 非010串

非010串 UsedToBe (命题人) 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 如果一个01字符串满足不存在010这样的子串,那么称它为非010串。 求长度为n的非010串...

51NOD 1537 分解

1537 分解 基准时间限制:0.5 秒 空间限制:131072 KB 分值: 80 难度:5级算法题问(1+sqrt(2)) ^n 能否分解成 sqrt(m) +sqrt(m-1)的形式 如...

快速矩阵快速幂

矩阵 快速幂 出处:http://www.cnblogs.com/yan-boy/archive/2012/11/29/2795294.html   矩阵的快速幂是用来高效地计算矩阵的高次方的...

矩阵快速幂

矩阵快速幂是一个很神奇的东西,你能够运用它来完成一些普通递推式无法完成的任务,当然了解矩阵快速幂之前,我们要先知道什么是矩阵乘法:矩阵乘法: 基本规则:当且仅当两个矩阵的元素个数为n*m和m*k(即前...
  • xhyds
  • xhyds
  • 2017-07-18 16:28
  • 62

矩阵快速幂

矩阵 快速幂 矩阵的快速幂是用来高效地计算矩阵的高次方的。将朴素的o(n)的时间复杂度,降到log(n)。 这里先对原理(主要运用了矩阵乘法的结合律)做下简单形象的介绍: ...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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