关闭

矩阵模板 51nod 算法马拉松分解问题

标签: 矩阵乘法马拉松算法
178人阅读 评论(0) 收藏 举报
分类:

题目:点击打开链接

一个矩阵乘法问题,(1+sqrt(2))的n次方!

#include<bits/stdc++.h>
    using namespace std;
#define maxn (1000000007)
struct Mat{
    long long mat[2][2];
};
Mat init(Mat x){
    x.mat[0][0]=1;
    x.mat[0][1]=2;
    x.mat[1][0]=1;
    x.mat[1][1]=1;
    return x;
}
Mat operator+(Mat a,Mat b)
{
    Mat c;
    int i,j;
    for (i=0;i<2;i++)
    {
        for (j=0;j<2;j++)
            c.mat[i][j] = a.mat[i][j]+b.mat[i][j];
    }
    return c;
}
Mat operator*(Mat a,Mat b)
{

    int i,j,k;
    Mat c;
    for (i=0;i<2;i++)
    {
        for (j=0;j<2;j++)
        {
       		c.mat[i][j] = 0;
       		for (k=0;k<2;k++)
       		{
                	c.mat[i][j]+=(a.mat[i][k]*b.mat[k][j])%maxn;
                	c.mat[i][j]=(c.mat[i][j]+maxn)%maxn;
       		}
       		//c.mat[i][j]%=MOD;
        }
    }
    return c;
}
Mat operator^(Mat a,long long x)
{

    Mat p=a;
    Mat q;
    q=init(q);

     while (x>=1)
     {
         if(x%2==1)
             p = p*q;
         x/=2;
         q = q*q;
     }

     return p;
}
int main(){
    long long n;
    cin>>n;
    Mat ans;
    ans.mat[0][0]=1;
    ans.mat[0][1]=0;
    ans.mat[1][0]=0;
    ans.mat[1][1]=1;
    if(n==0){
        printf("1\n");
    }
    else if(n%2==1){
        ans=ans^n;

        printf("%I64d\n",(ans.mat[1][0]*ans.mat[0][1])%maxn);
    }
    else{
        ans=ans^n;
        printf("%I64d\n",(ans.mat[0][0]*ans.mat[1][1])%maxn);
    }
    return 0;
}


0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

递归与分治策略:Strassen矩阵乘法

辅助函数 为了便于代码的编写,以及在函数参数中传二维数组的方便,写了以下三个辅助函数。 //数组寻址辅助函数 int& GetArrayVal( int* pMatrix, int nCol, int...
  • s634772208
  • s634772208
  • 2015-06-22 17:54
  • 2464

协同过滤推荐算法的优化(稀疏矩阵的处理)

简单的协同过滤算法流程如下 (1)、计算其他用户和你的相似度,可以使用反差表忽略一部分用户 (2)、根据相似度的高低找出K个与你最相似的邻居 (3)、在这些邻居喜欢的物品中,根据邻居与你的远近程...
  • chaiqunxing51
  • chaiqunxing51
  • 2016-03-25 10:05
  • 4763

拉丁矩阵问题 利用回溯法的C++实现方案

这两天正好在赶算法设计的作业,这里把做的几个需要写代码的题放上来,方便以后查看。 1.题目要求 2.算法思想 这个题目基本思想是 利用回溯法,对于 m 行 n 列, 本质上就是一个二维数...
  • zhyh1435589631
  • zhyh1435589631
  • 2015-05-25 20:53
  • 2138

51NOD 1836 战忽局的手段(矩阵乘法加速+__float128精度问题+概率期望)——算法马拉松20(告别美国大选及卡斯特罗)

传送门题目描述:众所周知,有一个神秘的组织——战忽局,在暗中保护着我们。在局中任职的官员都有着极强的忽悠技巧,不只能用预言,还能用往事忽悠人。如今某外星间谍已经获得了战忽局曾经参与的n次事件的资料,局...
  • qingshui23
  • qingshui23
  • 2016-12-03 19:09
  • 1322

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...
  • qingshui23
  • qingshui23
  • 2016-08-29 09:59
  • 690

51nod 1394 差和问题(算法马拉松8)

有一个集合S,初始状态下有n个元素,对他进行如下操作: 1、向S里面添加一个值为v的元素。输入格式为1 v 2、向S里面删除一个值为v的元素。输入格式为2 v 3、询问S里面的元素两...
  • caduca
  • caduca
  • 2015-11-30 16:05
  • 1964

51NOD算法马拉松 最大值问题 离线预处理+set lower_bound

题目:http://www.51nod.com/contest/problem.html#!problemId=1349 题意:100000个数的序列,有100000次询问,每次问区间最大值大于等于...
  • alpc_wt
  • alpc_wt
  • 2015-07-05 11:08
  • 1271

51nod 算法马拉松3 A:序列分解

序列分解 System Message (命题人) 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 小刀和大刀是双胞胎兄弟。今天他们玩一个有意思的游戏。 大...
  • u010885899
  • u010885899
  • 2015-07-05 20:37
  • 693

51Nod-算法马拉松17(告别奥运)-B-分解

ACM模版描述题解这道题,着实坑了我半个小时,题目有问题,不够严谨,m%1e9+7应该改为m%(1e9+7),因为一开始没有看出这个问题,所以我愣是看不懂样例,反应过来后也就明了了。这里问,能否分解,...
  • f_zyj
  • f_zyj
  • 2016-08-27 19:45
  • 395

51nod算法马拉松32

比赛链接 马拉松是真的难… 应该是我太菜了TnT A 特殊表示法 同bzoj1534 题解戳这里 B 小树 题意: n个有标号的点,其中m个是叶子节点。 问有多少数的形态。 做...
  • bestFy
  • bestFy
  • 2018-01-01 20:58
  • 37
    个人资料
    • 访问:5362次
    • 积分:202
    • 等级:
    • 排名:千里之外
    • 原创:16篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条
    最新评论