首页 > 其他分享 >T399750 Cell kingdom(Hard) 题解

T399750 Cell kingdom(Hard) 题解

时间:2023-11-18 13:55:42浏览次数:36  
标签:T399750 begin Mar end 题解 LL Cell base bmatrix

Link

T399750 Cell kingdom(Hard)

Qustion

第一天产生 \(1\) 个细胞,之后的每一天,一个细胞都会分裂成 \(8\) 个和自己一样的细胞,每个细胞在第三天都会自爆并且带走当天产生的 \(6\) 个细胞,求第 \(x\) 天有多少细胞

Solution

我们设 \(F[i]\) 表示第 \(i\) 天产生的新细胞个数

那么可以得出递推式

\[\begin{aligned} F[i]& =(F[i-1]+F[i-2])\times 7+F[i-2]\times 6 \\& =F[i-1]\times7+F[i-2] \end{aligned}\]

然后考虑如何化简这个递归式

我们可以构造处一个矩阵

\[\begin{bmatrix}F_{i-2}& F_{i-1}\end{bmatrix} \begin{bmatrix}0&1\\1&7\end{bmatrix}=\begin{bmatrix}F_{i-1}& F_{i-2}+7F_{i-1}\end{bmatrix}=\begin{bmatrix}F_{i-1}& F_{i}\end{bmatrix} \]

这样我们就得到了把递推式转化成了矩阵乘法

考虑到矩阵乘法的结合律,我们可以把相同的矩阵先乘起来,直接用快速幂处理

Code

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL TT=1e9+7;
struct Mar{
    LL a[2][2];
    Mar(){memset(a,0,sizeof a);}
};
Mar operator * (Mar A,Mar B){
    Mar ret;
    for(int i=0;i<2;i++)
    for(int j=0;j<2;j++)
    for(int k=0;k<2;k++){
        ret.a[i][j]+=(A.a[i][k]*B.a[k][j]%TT+TT)%TT;
        ret.a[i][j]=(ret.a[i][j]+TT)%TT;
    }
    return ret;
}
Mar Pow(Mar a,LL b){
    Mar ret;
    ret.a[0][0]=1;
    ret.a[1][1]=1;
    while(b){
        if(b&1) ret=ret*a;
        a=a*a;
        b>>=1;
    }
    return ret;
}
int main(){
    freopen("B.in","r",stdin);
    LL N;
    cin>>N;
    if(N==1){printf("1\n");return 0;}
    if(N==2){printf("8\n");return 0;}
    Mar base,st,ed;
    base.a[0][1]=1;base.a[1][0]=1;base.a[1][1]=7;
    st.a[0][0]=1;st.a[0][1]=7;
    Mar ans=Pow(base,N-2);
    ed=st*ans;
    cout<<(ed.a[0][0]+ed.a[0][1])%TT;
    return 0;
}

标签:T399750,begin,Mar,end,题解,LL,Cell,base,bmatrix
From: https://www.cnblogs.com/martian148/p/17840411.html

相关文章

  • T399742 Ting'er loves traveling 题解
    LinkT399742Ting'erlovestravelingQuestion给出一个图,使得\(1\)到\(N\)的路径上的最大值最小Solution看到最大值最小想到二分,二分最大值\(top\)然后去check验证能不能从\(1\)走到\(N\)Code#include<bits/stdc++.h>#defineintlonglongusingnamespacest......
  • 前端页面部署之后刷新页面之后出现HTTP 错误 404.0 - Not Found错误问题解决
    前端页面部署能正常访问,但是一旦刷新页面就报如下错误:404.0-NotFound 解决办法:下载IISURL重写模版,并安装。下面为安装地址:URLRewrite:TheOfficialMicrosoftIISSite安装之后IIS中出现如下IIS重写模块:点击进去添加规则,添加空白规则:  配置好之后会自动生成we......
  • T399751 Liangle's Rose Problem(亮亮的玫瑰问题)题解
    LinkT399751Liangle'sRoseProblem(亮亮的玫瑰问题)Question给出一个数组\(a\),有\(Q\)次询问,每次询问\([L,R]\)种随便挑选几个连续的\(a_i\)使得,他们几个的或的值最大Solution考虑贪心,如果把负数视为\(0\),那么一个数或上另外一个数,数肯定是变大的,那么就应该或上\(......
  • T399752 The Maze of the Imperial Sister(御姐的迷宫)题解
    LinkT399752TheMazeoftheImperialSister(御姐的迷宫)Question判断图内是否有环Solution先判断连通性,所有点是不是在一个块内,然后用树的性质,点数\(=\)边数\(+1\)判断Code#include<bits/stdc++.h>usingnamespacestd;constintmaxn=1e5+5,maxe=maxn*2;structI......
  • P4115 Qtree4 题解
    P4115看到单点修改,求全局白色的最远距离,可以使用点分树。考虑维护这棵点分树,想想树的直径的dp求法:\(f_u=\max\{f_v+w(u,v)\}\),答案为\(\max(f_v+f_{v'})(v,v'\in\{\text{son}_u\})\),\(\{\text{son}_i\}\)表示\(i\)的孩子集合。这时候维护就十分简单了,对于每个点都......
  • 电脑网站支付报错“验签出错,建议检查签名字符串或私钥与应用公钥是否匹配”问题解决记
    在对接支付宝电脑网站支付的时候,遇到如下报错:“错误代码invalid-signature错误原因:验签出错,建议检查签名字符串或签名私钥与应用公钥是否匹配”。但展示的报错内容跟实际原因有所出入(在下文中有解答),这里记录下问题的解决排查过程。问题复现在对接电脑网站支付时,生成form表单......
  • 【C++中cin在Qt输出终端无法手动输入问题解决办法(详细)】
    现象:在Qt中使用cin进行对一个变量z进行输入,然后在用cout对z进行输出,结果没有进行手动输入,程序自动凭空出现类似512,32759等一些数值输出。 解决办法:第一步:在Qt左侧项目栏,在.pro文件中添加一行代码CONFIG+=console 第二步:在项目--运行--勾选在终端中运行(Runinterminal) 配置......
  • 梯度消失和梯度爆炸——从本质上说残差、LSTM遗忘门(依赖cell state)解决思路都是一样的
    在深度学习中,梯度消失和梯度爆炸是两个常见的问题。梯度消失是指在进行反向传播时,梯度会随着层数的增加而指数级地减小,直到几乎消失,导致深层的神经网络参数无法有效更新。这主要是因为使用了像sigmoid和tanh这样的激活函数,它们在输入值较大或较小的情况下,梯度值接近于0。    梯......
  • 苏格拉底问答、实践过程截图、遇到问题解决问题截图,代码链接
    #include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<semaphore.h>#include<pthread.h>#definemsleep(x)usleep(x*1000)#definePRODUCT_SPEED3//生产速度#defineCONSUM_SPEED1......
  • UVA 11178 Morley's Theorem 题解
    计算几何LinkUVA11178Morley'sTheoremQuestionMorley定理是这样的,作三角形ABC每个内角的三等分线,相交成三角形DEF,则DEF是等边三角形给出\(A,B,C\)坐标,求\(D,E,F\)坐标Solution其实是一道计算几何板子题只需要计算\(\angleABC\)的值\(a\),然后把\(BC\)逆......