牛客小白月赛6 洋灰三角(详解)
链接: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 洋灰三角(详解)相关推荐
- 牛客-牛客小白月赛6-J 洋灰三角
J 洋灰三角 链接:https://www.nowcoder.com/acm/contest/136/ ...
- (找规律+贪)牛客小白月赛33 I 三角尼姆
https://ac.nowcoder.com/acm/contest/11210/I 思路 一看博弈问题 好我们考虑分类讨论, 先推一下样例 1 Alice 2 Alice 3 Bob 4 Bob ...
- 牛客小白月赛6 J.洋灰三角
牛客小白月赛6 J.洋灰三角 题目链接 题目描述 洋灰是一种建筑材料,常用来筑桥搭建高层建筑,又称,水泥.混凝土. WHZ有很多铸造成三角形的洋灰块,他想把这些洋灰三角按照一定的规律放到摆成一排的n个 ...
- 牛客小白月赛16 小石的签到题(博弈)
牛客小白月赛16 小石的签到题 链接:https://ac.nowcoder.com/acm/contest/949/A来源:牛客网 题目描述 输入描述: 共一行,输入一个数 nnn . 输出描述: ...
- F.孤独(牛客小白月赛39)
F.孤独(牛客小白月赛39) 题意: 给定一棵树,寻找一个路径,将断掉所有与这个路径上的点相连的边,使得剩下的最大连通块的大小最小 题解: 这题有点印象,感觉做过,至少这个方法肯定遇到过 设dp[u] ...
- 牛客小白月赛58 B(暴力)C(思维)D(dp滚动数组优化)
牛客小白月赛58 感觉没什么意思,这场月赛出题人有点问题. B 题意:给定一定的数据填充顺序和每一个填充层的名称,只有填充满了上一层才可以填充下一层. 但是每一层又属于某一个大层,一个大层中包含了若干 ...
- 牛客小白月赛65个人题解A-E
1. 牛客小白月赛65 A. 牛牛去购物 题意:给定n元,购买价格为a元的篮球和价格为b的篮球,数量不定,要使得花掉的钱最多,也就是剩余的钱数最少,求这个值 (1 <= n, a, b < ...
- 牛客小白月赛24 J.建设道路
牛客小白月赛24 J.建设道路 题目链接 题目描述 牛牛国有 nnn 个城市,编号为 1-n,第 iii 个城市有一个价值 aia_iai ,牛国的国王牛阔落特别喜欢在牛牛国旅游,并且他不想每次旅游 ...
- 牛客小白月赛4 D.郊区春游
牛客小白月赛4 D.郊区春游 题目链接 题目描述 今天春天铁子的班上组织了一场春游,在铁子的城市里有 nnn 个郊区和 mmm 条无向道路,第 iii 条道路连接郊区 AiA_iAi 和 BiB_i ...
最新文章
- python教学反思_Python第3课if教学反思:准备充分承上启下,优化内容模式初显
- Netty解决粘包和拆包问题的四种方案
- github提交,却不显示提交记录
- python祝福祖国代码_国庆节踩空间留言代码_国庆节祝福正在加载中
- Action Service Dao三层的功能划分
- 大话设计模式—备忘录模式
- 图文并茂的聊聊Java内存模型!
- OLE DB , ODBC , ADO 知识了解
- FFmpeg与libx264接口源代码简单分析
- 使用 Solr 构建企业级搜索服务器
- paip.log4j兼容linux windows 路径设置
- goback history 传递参数_vue-router go(-1)后退时怎么带参数?
- 据说这是最难学的十大编程语言 Java排第三
- 自动驾驶技术基础——惯导
- c语言中判断星期几的程序,用C语言编程:输入某年某月某日,判断这一天是这一年的第几个星期中的星期几...
- 正在考虑写一本书《中国有所没有围墙的大学,影响了世界几千年》第一章请给个反响...
- hive sql 向上取整、向下取整、保留小数位的函数
- Debian安装docker全流程
- 运用简单的超市购物车系统,理解重写equals、hashcode的意义
- Bluetooth 由来及发展历程
热门文章
- linux中改变修改图片大小:使用convert命令
- mac下Homebrew安装Fetching /usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask failed报错解决方法
- 嵌入式软件开发培训笔记——ARM架构Linux系统下交叉编译环境搭建、NFS、TFTP服务配置及Nandflash的读写
- Android Studio 真机调试vivo系列手机安装失败处理
- 现表情包大幅流行,今天教你们开发个人表情包网站
- docker下载后安装失败:This computer doesn’t have VT-X/AMD-v enabled. Enabling it in the BIOS is mandatory.
- [HXBCTF 2021]湖湘杯easywill
- 上千单韵达快递如何快速完成物流查询
- 【渝粤题库】陕西师范大学165207 人才测评 作业(专升本)
- 电容充放电时间计算方法(指数衰减脉冲) 附C代码模拟实现