链接:https://www.nowcoder.com/acm/contest/136/J
来源:牛客网

洋灰三角

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

洋灰是一种建筑材料,常用来筑桥搭建高层建筑,又称,水泥、混凝土。

WHZ有很多铸造成三角形的洋灰块,他想把这些洋灰三角按照一定的规律放到摆成一排的n个格子里,其中第i个格子放入的洋灰三角数量是前一个格子的k倍再多p个,特殊地,第一个格子里放1个。
    WHZ想知道把这n个格子铺满需要多少洋灰三角。

输入描述:

第一行有3个正整数n,k,p。

输出描述:

输出一行,一个正整数,表示按照要求铺满n个格子需要多少洋灰三角,由于输出数据过大,你只需要输出答案模1000000007(1e9+7)后的结果即可。

示例1

输入

复制

3 1 1

输出

复制

6

说明

洋灰三角铺法:1 2 3,总计6个

示例2

输入

复制

3 2 2

输出

复制

15

说明

洋灰三角铺法:1 4 10,总计15个

示例3

输入

复制

3 3 3

输出

复制

28

说明

洋灰三角铺法:1 6 21,总计28个

备注:

对于100%的测试数据:
1 ≤ n ≤ 1000000000
1 ≤ k,p ≤ 1000

大致思路:

首先,我们很容易得到这两个表达式:sum(n)=sum(n-1)+a(n),a(n)=k*a(n-1)+p。

显然,常规思路求sum(n),就一定求知道sum(n-1),a(n);

但是,对于大规模的数据,这样操作肯定是不行的。我们要知道另一种更加普遍高效的算法。矩阵快速幂。

比如说我们可以构造一个等比矩阵。使其A[n]=T^(n-1)*A[1],  (其中,n>1), 这样 ,我们仅仅需要知道矩阵T,A[1],就能

很快的求出A[n];

现在,我们来尝试构造这个矩阵A,以及公比矩阵T:

因                             sum(n)  =  sum(n-1) + a(n)

又                               a(n)     =  k*a(n-1) + p

则                              sum(n) = sum(n-1) +  k*a(n-1) + p

由矩阵相乘性质有:

T[0]={1,k,1}                                               (或T[0]={1,k,p}等,只要能构造成功、自圆其说即可)

sum(n-1)

故                 A(n-1) = {      a(n-1)        }

p

因此

sum(n)

A(n-1) = {        a(n)        }

p

于是解得

1      k       1

T= {   0      k       1 }

0      0       1

1      k    1        sum(n-1)        sum(n)
                                  
    0      k    1     ×   a(n-1)     =     a(n)
          
    0      0    1            p                    p

或者

1      k    p         sum(n-1)        sum(n)
                                    
    0      k    p     ×     a(n-1)    =     a(n)
          
    0      0    1              1                   1

ac代码如下

# include <iostream>
# include <cstring>
# define ll long longusing namespace std;const ll mod = 1e9+7;ll n,k,p;struct matrix
{ll m[5][5];}ans,res;//res为T矩阵,ans为A(n)void init()
{memset(res.m,0,sizeof res.m);//构造T矩阵res.m[1][1]=1;res.m[1][2]=k;res.m[1][3]=1;res.m[2][1]=0;res.m[2][2]=k;res.m[2][3]=1;res.m[3][1]=0;res.m[3][2]=0;res.m[3][3]=1;return ;
}matrix calc(matrix a,matrix b)//矩阵相乘
{matrix tmp;for(int i=1;i<=3;i++)for(int j=1;j<=3;j++)tmp.m[i][j]=0;for(int i=1;i<=3;i++)for(int j=1;j<=3;j++)for(int k=1;k<=3;k++){tmp.m[i][j]+=a.m[i][k]*b.m[k][j];tmp.m[i][j]%=mod;}return tmp;
}void quick_pow(int n)//矩阵快速幂
{for(int i=1;i<=3;i++)//单位矩阵for(int j=1;j<=3;j++){if(i==j)ans.m[i][j]=1;elseans.m[i][j]=0;}while(n){if(n&1) ans=calc(ans,res);res=calc(res,res);n>>=1;}
}int main()
{cin>>n>>k>>p;ll sum=0;if(n==2){sum+=k+p+1;sum%=mod;cout<<sum<<endl;return 0;}if(n==1){cout<<"1"<<endl;return 0;}init();quick_pow(n-1);sum+=(ans.m[1][1]+ans.m[1][2]+ans.m[1][3]*p)%mod;cout<<sum<<endl;return 0;
}

牛客小白月赛6 洋灰三角(详解)相关推荐

  1. 牛客-牛客小白月赛6-J 洋灰三角

                                                     J 洋灰三角 链接:https://www.nowcoder.com/acm/contest/136/ ...

  2. (找规律+贪)牛客小白月赛33 I 三角尼姆

    https://ac.nowcoder.com/acm/contest/11210/I 思路 一看博弈问题 好我们考虑分类讨论, 先推一下样例 1 Alice 2 Alice 3 Bob 4 Bob ...

  3. 牛客小白月赛6 J.洋灰三角

    牛客小白月赛6 J.洋灰三角 题目链接 题目描述 洋灰是一种建筑材料,常用来筑桥搭建高层建筑,又称,水泥.混凝土. WHZ有很多铸造成三角形的洋灰块,他想把这些洋灰三角按照一定的规律放到摆成一排的n个 ...

  4. 牛客小白月赛16 小石的签到题(博弈)

    牛客小白月赛16 小石的签到题 链接:https://ac.nowcoder.com/acm/contest/949/A来源:牛客网 题目描述 输入描述: 共一行,输入一个数 nnn . 输出描述: ...

  5. F.孤独(牛客小白月赛39)

    F.孤独(牛客小白月赛39) 题意: 给定一棵树,寻找一个路径,将断掉所有与这个路径上的点相连的边,使得剩下的最大连通块的大小最小 题解: 这题有点印象,感觉做过,至少这个方法肯定遇到过 设dp[u] ...

  6. 牛客小白月赛58 B(暴力)C(思维)D(dp滚动数组优化)

    牛客小白月赛58 感觉没什么意思,这场月赛出题人有点问题. B 题意:给定一定的数据填充顺序和每一个填充层的名称,只有填充满了上一层才可以填充下一层. 但是每一层又属于某一个大层,一个大层中包含了若干 ...

  7. 牛客小白月赛65个人题解A-E

    1. 牛客小白月赛65 A. 牛牛去购物 题意:给定n元,购买价格为a元的篮球和价格为b的篮球,数量不定,要使得花掉的钱最多,也就是剩余的钱数最少,求这个值 (1 <= n, a, b < ...

  8. 牛客小白月赛24 J.建设道路

    牛客小白月赛24 J.建设道路 题目链接 题目描述 牛牛国有 nnn 个城市,编号为 1-n,第 iii 个城市有一个价值 aia_iai​ ,牛国的国王牛阔落特别喜欢在牛牛国旅游,并且他不想每次旅游 ...

  9. 牛客小白月赛4 D.郊区春游

    牛客小白月赛4 D.郊区春游 题目链接 题目描述 今天春天铁子的班上组织了一场春游,在铁子的城市里有 nnn 个郊区和 mmm 条无向道路,第 iii 条道路连接郊区 AiA_iAi​ 和 BiB_i ...

最新文章

  1. python教学反思_Python第3课if教学反思:准备充分承上启下,优化内容模式初显
  2. Netty解决粘包和拆包问题的四种方案
  3. github提交,却不显示提交记录
  4. python祝福祖国代码_国庆节踩空间留言代码_国庆节祝福正在加载中
  5. Action Service Dao三层的功能划分
  6. 大话设计模式—备忘录模式
  7. 图文并茂的聊聊Java内存模型!
  8. OLE DB , ODBC , ADO 知识了解
  9. FFmpeg与libx264接口源代码简单分析
  10. 使用 Solr 构建企业级搜索服务器
  11. paip.log4j兼容linux windows 路径设置
  12. goback history 传递参数_vue-router go(-1)后退时怎么带参数?
  13. 据说这是最难学的十大编程语言 Java排第三
  14. 自动驾驶技术基础——惯导
  15. c语言中判断星期几的程序,用C语言编程:输入某年某月某日,判断这一天是这一年的第几个星期中的星期几...
  16. 正在考虑写一本书《中国有所没有围墙的大学,影响了世界几千年》第一章请给个反响...
  17. hive sql 向上取整、向下取整、保留小数位的函数
  18. Debian安装docker全流程
  19. 运用简单的超市购物车系统,理解重写equals、hashcode的意义
  20. Bluetooth 由来及发展历程

热门文章

  1. linux中改变修改图片大小:使用convert命令
  2. mac下Homebrew安装Fetching /usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask failed报错解决方法
  3. 嵌入式软件开发培训笔记——ARM架构Linux系统下交叉编译环境搭建、NFS、TFTP服务配置及Nandflash的读写
  4. Android Studio 真机调试vivo系列手机安装失败处理
  5. 现表情包大幅流行,今天教你们开发个人表情包网站
  6. docker下载后安装失败:This computer doesn’t have VT-X/AMD-v enabled. Enabling it in the BIOS is mandatory.
  7. [HXBCTF 2021]湖湘杯easywill
  8. 上千单韵达快递如何快速完成物流查询
  9. 【渝粤题库】陕西师范大学165207 人才测评 作业(专升本)
  10. 电容充放电时间计算方法(指数衰减脉冲) 附C代码模拟实现