洋灰三角(矩阵快速幂的两种解法)
链接:https://www.nowcoder.com/acm/contest/136/J
来源:牛客网
WHZ想知道把这n个格子铺满需要多少洋灰三角。
![](/assets/blank.gif)
代码:
#include<cstdio> #include<cstring> #define ll long long #define mod int(1e9+7) ll k, p; struct jz {ll num[3][3];jz(){ memset(num, 0, sizeof(num)); }jz operator*(const jz &p){jz ans;for (int k = 0; k < 3;++k)for (int i = 0; i < 3;++i)for (int j = 0; j < 3; ++j)ans.num[i][j] = (ans.num[i][j] + num[i][k] * p.num[k][j] % mod) % mod;return ans;} }pp; jz POW(jz x, ll n) {jz ans;for (int i = 0; i < 3; i++) ans.num[i][j] = 1;for (; n; n>>=1, x=x*x)if (n & 1)ans = ans*x;return ans; } void init() {pp.num[0][0] = 1; pp.num[0][1] = k; pp.num[0][2] = 1;pp.num[1][1] = k; pp.num[1][2] = 1; pp.num[2][2] = 1; } int main() {ll n;scanf("%d%d%d", &n, &k, &p);ll s2 = 1 + k + p;if (n == 1){ printf("1\n"); return 0; }else if (n == 2){ printf("%lld\n", s2); return 0; }init();pp = POW(pp, n - 2);printf("%lld", (pp.num[0][0] + pp.num[0][1] + (p*pp.num[0][2])%mod) % mod);return 0; }
方法二:
sn=(k+1)sn-1-ksn-2+q
注意:在矩阵中负数要 -k <=> mod-k; 还有:已经使用了上面的公式,意味着sn是新的数列,注意把s1和s2求好。仔细一些
#include<cstdio> #include<cstring> #define ll long long #define mod int(1e9+7) ll p, k; struct jz {long long num[3][3];jz() { memset(num, 0, sizeof(num)); }jz operator*(const jz &P)const{jz ans;for (int k = 0; k<3; k++)for (int i = 0; i<3; i++)for (int j = 0; j<3; j++)ans.num[i][j] = (ans.num[i][j] + num[i][k] * P.num[k][j] % mod) % mod;return ans;} }pp; jz pOw(jz X, long long m) {jz ans;for (int i = 0; i < 3; ++i)ans.num[i][i] = 1;for (; m; m >>= 1, X = X*X)if (m & 1)ans = ans*X;return ans; } void init() {pp.num[0][0] = k + 1; pp.num[0][1] = mod-k; pp.num[0][2] = p;pp.num[1][0] = 1; pp.num[2][2] = 1; } int main() {ll n;scanf("%lld%lld%lld", &n, &k, &p);init();ll s1 = 1, s2 = k + p+1;if (n == 2){ printf("%lld\n", s2); return 0; }else if (n == 1){ printf("%lld\n", 1); return 0; }pp = pOw(pp, n - 2);printf("%lld\n", (((s2%mod)*pp.num[0][0])%mod + pp.num[0][1] + pp.num[0][2]) % mod);return 0; }
转载于:https://www.cnblogs.com/ALINGMAOMAO/p/9500268.html
洋灰三角(矩阵快速幂的两种解法)相关推荐
- 洋灰三角 矩阵快速幂
洋灰三角 矩阵快速幂 我的思路: 先定义一个矩阵,然后通过矩阵的相乘,实现n>>1的效果. 我的解法:(满分答案) //#include<bits/stdc++.h> #inc ...
- 完全理解乘法快速幂及其两种写法的解析
an=?0≤n≤10105an=?0≤n≤10105 a^n=? \qquad 0 \le n \le 10^{10^5} 没错,乘法快速幂就是解决上述问题的. 乘法快速幂的思想 可以看到,要求一个数 ...
- leetcode 73 矩阵置零 C++ 两种解法
leetcode 73 两种解法~~,没有一个是我想出来的,哈哈~~ one class Solution {public:void setZeroes(vector<vector<int ...
- 【C语言】杨辉三角常用且简单的两种解法(超详细解说)
学习就是重复重复再重复!!! 目录
- 矩阵快速幂及斐波那契数列
1.通用模板:矩阵快速幂 前几天写过一篇矩阵快速幂的一种解法,但是当时只是初学,所以用了当时我更好理解的方法去做.那个解法需要调用两个很相像的函数,而且容易造成紊乱,也不利于矩阵快速幂的推广,所以在观 ...
- 1005 矩阵快速幂
1005 矩阵快速幂 本体有2种方法,一种是矩阵快速幂,一种是找规律.我用的是矩阵快速幂. f(1)=1; f(2)=1; f(n)=( A*(f(n-1)) + B*(f(n-2)) )mod7; ...
- 矩阵快速幂的学习(系统的学习)
学习博客:https://www.cnblogs.com/cmmdc/p/6936196.html https://www.cnblogs.com/yan-boy/archive/2012/11/29 ...
- C语言实现求解斐波那契数列的四种方法及优化处理(递归,迭代,特殊性质公式,矩阵快速幂)
众所周知,斐波那契数列是非常经典的一个数列,它的数学公式如下 为了便于观察,我们列出它的几项:0 1 1 2 3 5 8 13 21...... 下面我们将介绍四种方法来用C语言计算机 ...
- 【做题】SRM701 Div1 Hard - FibonacciStringSum——数学和式&矩阵快速幂
原文链接 https://www.cnblogs.com/cly-none/p/SRM701Div1C.html 题意:定义"Fibonacci string"为没有连续1的01串 ...
最新文章
- 第十五周程序阅读-范型程序设计(5)
- sql php修改mysql结构_sql怎么修改表内容
- mysql 拼音查询_mysql实现用拼音搜索中文的数据库实现
- CentOS 修改IP地址, DNS, 网关
- 单片机按键软硬件设计技巧!
- 使用标定板对相机位姿进行估计
- U-BOOT之一:BootLoader 的概念与功能
- java列表展开折叠,jQuery Datatables rowGroup折叠/展开
- 使用Navicat为数据库表建立触发器
- 算法工程师面试备战笔记7_数据清洗与特征处理
- 和阿里同年创办,为何当当却走向了“卖身”的结局?
- PHP 数组拼接成字符串
- Android开发之常见事件响应方式
- freeradius mysql_centos7 freeradius mysql配置
- poi批量导入html,读取excel(POI)【转换为html】 - bcoffee的专栏 - 博客频道 - CSDN.NET...
- smartbi v7 Linux,安装Smartbi
- #9733;电车难题的n个坑爹变种
- 第三方远程控制工具TeamViewer的安装和使用教程,可下载window版和linux版,windows使用虚拟机可以与linux之间通讯
- RV-LINK:将 GD32VF103C-START 开发板变成 RISCV-V 仿真器
- 各大互联网大厂年终奖一览表,又是别人家的公司!
热门文章
- 上瘾:让用户养成使用习惯的四大产品逻辑
- 导盲背包或将代替导盲犬:这款视障者的智能出行方案值得围观
- 应届生实习时一些建议
- python自动化工业_五大python自动化框架学习
- 蓝湖切图后如何做成html,蓝湖支持「切图压缩」了!
- QtQuick PC端开发实战_专栏总目录
- 2022 IoTDB Summit:阿里白渐《迈向物联网时代大数据计算平台——MaxCompute 基于IoTDB构建解决方案》...
- 清洁机器人--沿边测距传感器 sharp psd红外传感器的FOV角度分析
- Brightcove发布新视频压缩技术测试版
- 软件调研:CSDN 问答 VS StackOverFlow