矩阵快速幂解法:

这是一个类似斐波那契数列的矩乘快速幂,所以推荐大家先做一下下列题目:(会了,差不多就是多倍经验题了)

注:如果你不会矩阵乘法,可以了解一下P3390的题解

P1939 【模板】矩阵加速(数列)

P3390 【模板】矩阵快速幂

P1306 斐波那契公约数

P1962 斐波那契数列

P4838 P哥破解密码

由题意可得:相邻两个珠子中必有金属性珠子。这其实就可以理解为不能有连续的两个木属性珠子。这样一看,此题就和P4838 P哥破解密码差不多了。只不过这题是个2*2矩阵乘法

进入正文:

我们先一次将1~n中每一个珠子的情况枚举


// n=1 n=2 n=3 n=4 n=5 n=6 .......
//可放金属性珠子: 1 2 3 5 8 13 .......
//可放木属性珠子: 1 1 2 3 5 8 .......

不难发现这就是一个斐波那契数列的递推

但是:这是一个手环!

所以第一个珠子与最后一个手环是相连的,他们会互相影响!

不过他们只会影响对方而不会影响其他珠子,我们可以将第一颗珠子选金属性与木属性这两种情况分开:

//第一颗珠子为金属性: 若 n=5
// 1 2 3 4 n .......
//金属性: 1 1 2 3 5 .......
//木属性: 0 1 1 2 3 ....... //第一颗珠子为木属性: n=5
// 1 2 3 4 n .......
//金属性: 0 1 1 2 3 .......
//木属性: 1 0 1 1 0 .......
//最后一颗不能为木!
//两种情况加起来就是样例1的解了

所以此题就是求斐波那契数列第n项第n-1项的两倍

然后就可矩阵快速幂了!递推矩阵如下

//                     1 1
// 0 1

不过我们当然不能止步于此:

因为还有一种更无脑有效的方法:

既然矩阵可以快速幂,那么说明每两个递推数(即答案)之间的递推矩阵是一样的!

所以我们可以先手算两组结果,然后直接推出递推矩阵:


// 3 4 乘 递推矩阵 = 4 7 // 解上述方程得递推矩阵为:
// 0 1
// 3 4 乘 = 4 7
// 1 1

下面上代码:

#include<bits/stdc++.h>
using namespace std;
#define mod 1000000007//简化一下
struct ju{
long long a[2][2];//不用long long只有8分哦(亲测QAQ)
ju operator *(const ju &x){
ju res;//这里需要另外建个矩阵存答案
memset(res.a,0,sizeof(res.a));
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
for(int k=0;k<2;k++)
res.a[i][j]=(res.a[i][j]+a[i][k]%mod*(x.a[k][j])%mod)%mod;
return res;
} //重载运算符,(可以写成函数)
}base,ans;//两个基本矩阵
int main(){
long long n,t;
scanf("%lld",&t);//只有t就不写快读了
while(t--){
scanf("%lld",&n);n--;//n要减一,不然会错 QAQ
base.a[0][0]=0;base.a[0][1]=1;base.a[1][0]=1;base.a[1][1]=1;
ans.a[0][0]=2;ans.a[0][1]=1;ans.a[1][0]=0;ans.a[1][1]=0;//初始化
while(n){//快速幂,(也可以写成函数)
if(n%2==1) ans=ans*base;
base=base*base;
n/=2;
}
printf("%lld\n",ans.a[0][1]%mod);
} //输出
return 0;
}

代码中ans的初始化已经是n=1时的答案了所以n要减一。

啊,写题解好累啊,是我太蒟了吗。。

洛谷 P4910 帕秋莉的手环 矩阵乘法+快速幂详解的更多相关文章

  1. [洛谷P4910]帕秋莉的手环

    题目大意:有一个$n(n\leqslant10^{18})$个点的环,每个点可以是$0$或$1$,要求相邻点中至少一个$1$,问方案数,多组询问. 题解:先考虑是一条链的情况,令$f_{i,j}$表示 ...

  2. 洛谷 P4910 帕秋莉的手环

    题意 多组数据,给出一个环,要求不能有连续的\(1\),求出满足条件的方案数 \(1\le T \le 10, 1\le n \le 10^{18}\) 思路 20pts 暴力枚举(不会写 60pts ...

  3. P4910 帕秋莉的手环

    题目背景 帕秋莉是蕾米莉亚很早结识的朋友,现在住在红魔馆地下的大图书馆里.不仅擅长许多魔法,还每天都会开发出新的魔法.只是身体比较弱,因为哮喘,会在咏唱符卡时遇到麻烦. 她所用的属性魔法,主要是生命和 ...

  4. [Luogu] P4910 帕秋莉的手环

    题目背景 帕秋莉是蕾米莉亚很早结识的朋友,现在住在红魔馆地下的大图书馆里.不仅擅长许多魔法,还每天都会开发出新的魔法.只是身体比较弱,因为哮喘,会在咏唱符卡时遇到麻烦. 她所用的属性魔法,主要是生命和 ...

  5. 【题解】Luogu P4910 帕秋莉的手环

    原题传送门 "连续的两个中至少有1个金的"珂以理解为"不能有两个木相连" 我们考虑一个一个将元素加入手环 设f\([i][0/1]\)表示长度为\(i\)手环末 ...

  6. 洛谷3176 [HAOI2015]数字串拆分 (矩阵乘法+dp)

    qwq真的是一道好题qwq自己做基本是必不可能做出来的. 首先,如果这个题目只是求一个\(f\)数组的话,那就是一道裸题. 首先,根据样例 根据题目描述,我们能发现其实同样数字的不同排列,也是属于不同 ...

  7. 洛谷 P4569 - [BJWC2011]禁忌(AC 自动机+矩阵乘法)

    题面传送门 又好久没做过 AC 自动机的题了,做道练练手罢( 首先考虑对于某个固定的字符串怎样求出它的伤害,我们考虑贪心,每碰到出现一个模式串就将其划分为一段,最终该字符串的代价就是划分的次数.具体来 ...

  8. 洛谷P2886 [USACO07NOV]Cow Relays G (矩阵乘法与路径问题)

    本题就是求两点间只经过n条边的最短路径,定义广义的矩阵乘法,就是把普通的矩阵乘法从求和改成了取最小值,把内部相乘改成了相加. 代码包含三个内容:广义矩阵乘法,矩阵快速幂,离散化: 1 #include ...

  9. 【Cogs2187】帕秋莉的超级多项式(多项式运算)

    [Cogs2187]帕秋莉的超级多项式(多项式运算) 题面 Cogs 题解 多项式运算模板题 只提供代码了.. #include<iostream> #include<cstdio& ...

随机推荐

  1. wordpress 5.1 后台拿shell

    闲着没事搭建了一套最新版wordpress 5.1,本身wordpress后台安全防御是比较差的,想尝试下后台是否可以拿shell. 再上传插件的地方可以直接上传php文件,并且该文件可以执行: sh ...

  2. 初始化Weex项目遇到的问题记录

    Weex 提供了一个命令行工具 weex-toolkit 来帮助开发者使用 Weex.它可以用来快速创建一个空项目.初始化 iOS 和 Android 开发环境.调试.安装插件等操作. 目前 weex ...

  3. Hybrid APP基础篇(二)->Native、Hybrid、React Native、Web App方案的分析比较

    说明 Native.Hybrid.React.Web App方案的分析比较 目录 前言 参考来源 前置技术要求 楔子 几种APP开发模式 概述 Native App Web App Hybrid Ap ...

  4. Scrum Meeting NO.3

    Scrum Meeting No.2 1.会议内容 之前的两天无法登录TFS服务器来生成燃尽图,再加上这种方式只能生成当日的燃尽图,我们决定改用excel生成燃尽图.(作为一个渣渣pm,我用了一下午才 ...

  5. 2017-2018 第一学期201623班《程序设计与数据结构》-第9&10周作业问题总结

    一.作业内容 第8周作业 http://www.cnblogs.com/rocedu/p/7484252.html#WEEK08 第9周作业 http://www.cnblogs.com/rocedu ...

  6. 第二个Sprint冲刺第六天(燃尽图)补

  7. 团队作业(五)-笔记app top5

    在互联网快速发展的情况下,各个行业的软件层出不穷,五花八门.各个行业都有相当多的软件介入其中,在如此多的软件之中,便有了相当激烈的竞争角逐.今天我们十五万的总冠军就着笔记APP行业中位列top 5的软 ...

  8. 常用的Hql语句

    // HQL: Hibernate Query Language.// 特点:// >> 1,与SQL相似,SQL中的语法基本上都可以直接使用.// >> 2,SQL查询的是表 ...

  9. [代码]--db2中left()函数和right()函数对应oracle中的substr()函数

     DB2 LEFT.RIGHT函数 语法:LEFT(ARG,LENGTH).RIGHT(ARG,LENGTH) LEFT.RIGHT函数返回ARG最左边.右边的LENGTH个字符串,ARG可以是CHA ...

  10. Python【知识点】傻傻的函数内变量

    问题的由来 有个学生问我一个问题关于函数内部变量的我们来一起看下代码: Code1 x = 50 def func(): print(x) global x print("x修改前的值:&q ...