矩阵快速幂解法:

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

注:如果你不会矩阵乘法,可以了解一下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. Fragment 使用总结

    1. 要深刻理解Fragment 的生命周期 2. Fragment.getActivity()并不能保证非空. 3.如果在Fragment中有异步的回调, 特别要注意此时Fragment 是否还at ...

  2. PAT甲题题解-1008. Elevator (20)-大么个大水题,这也太小瞧我们做题者的智商了

    如题... #include <iostream> #include <cstdio> #include <algorithm> #include <cstr ...

  3. 1092. To Buy or Not to Buy (20)-map

    给出两个字符串,判断第二个字符串中的字符是否都出现在第一个中. 是,则输出Yes,以及多余的字符的个数. 否,则输出No,以及缺失的个数. #include <iostream> #inc ...

  4. Daily Scrum - 12/0809

    Meeting Minutes (08的Scrum报告放在word里,publish没有成功,所以这是08-09的报告,抱歉…): 卡片翻转的效果确认完成: 按钮蓄力的效果确认完成: 按钮上移的效果确 ...

  5. PAT 1048 数字加密

    https://pintia.cn/problem-sets/994805260223102976/problems/994805276438282240 本题要求实现一种数字加密方法.首先固定一个加 ...

  6. bootstrap响应式布局列子

    <!DOCTYPE html><html lang="zh-CN"> <head> <meta charset="utf-8&q ...

  7. ThreadLocal变量

    什么是ThreadLocal变量?ThreadLocal,很多地方叫做线程本地变量,也有些地方叫做线程本地存储,其实意思差不多.可能很多朋友都知道ThreadLocal为变量在每个线程中都创建了一个副 ...

  8. Memcache 优化建议

    一.memcached工作原理 基本概念:slab,page,chunk. slab,是一个逻辑概念.它是在启动memcached实例的时候预处理好的,每个slab对应一个chunk size,也就是 ...

  9. 99种用Racket说I love you的方式

    99种用Racket说I love you的方式 来源 https://www.tuicool.com/articles/qiyeAz 原文  http://www.soimort.org/posts ...

  10. 【BZOJ1090】[SCOI2003]字符串折叠(动态规划)

    [BZOJ1090][SCOI2003]字符串折叠(动态规划) 题面 BZOJ 洛谷 题解 区间\(dp\).设\(f[i][j]\)表示压缩\([i,j]\)区间的最小长度.显然可以枚举端点转移.再 ...