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 1537 分解(矩阵快速幂)——算法马拉松17(告别奥运)

传送门问 (1+2√)n(1+\sqrt 2) ^n 能否分解成 m−−√+(√m−1)\sqrt m +\sqrt(m-1)的形式 如果可以 输出 m MOD (109+7)m\ MOD\ (1...

51nod 1242 斐波那契数列的第N项(矩阵快速幂)

1242 斐波那契数列的第N项 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 斐波那契数列的定义如下...
  • yeguxin
  • yeguxin
  • 2015年08月27日 16:43
  • 832

51nod 1113 矩阵快速幂

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

51nod 1122 机器人走方格 V4[矩阵快速幂]

题面 计算到达从某个点到某个点的方案数,考虑构造矩阵:给四个格子编号,构造可达矩阵 然后快速幂计算完把合法的答案累计一下就好了#include #include #define N 4 #defi...

51nod 1358 浮波那契【思维+矩阵快速幂】好题!

1358 浮波那契 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 TengBieBie已经学习了很多关于斐波那切数列的性质,所以他感到...

51Nod-1113-矩阵快速幂

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

51nod--1113 矩阵快速幂

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

51nod 1113 矩阵快速幂【裸题】【内含黑科技】

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

矩阵快速幂 51nod

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

51nod 1242 斐波那契数列的第N项(矩阵快速幂)

1242 斐波那契数列的第N项 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 斐波那契数列的定义如下: F(0) = 0 F(...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:51nod - 1573 分解 - 矩阵快速幂
举报原因:
原因补充:

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