LINK:牛牛的斐波那契字符串

虽然sb的事实没有改变 但是 也不会改变。

赛时 看了E和F题 都不咋会写 所以弃疗了。

中午又看了一遍F 发现很水 差分了一下就过了。

这是下午和古队长讨论+看题解的神仙做法的时候 突然想到的。

问题的难点在于 a和b的长度有可能是小于s的 所以递推不了 只能暴力。

暴力的背后藏着正解。可以发现当a和b的长度扩大到大于s时 容易发现 每次s匹配的 不可能横跨a b了 所以此时只有可能是a的后缀接b的后缀 或者b的后缀接a的后缀。

而这个我们可以递推式子分奇偶考虑。然后 就可以直接递推了。

题解的神仙做法是 杜教BM 不过 做法过于神仙 也没有学习的必要 所以弃疗。

直接考虑矩阵乘法 这个东西 虽然带系数不过 矩阵是可以列出的 还很容易 我列了一个\(4\cdot 4\)的。

细节比较繁琐。值得注意。

const ll MAXN=1000010;
ll n,ans,cnt=2,ww=2,d1,d2;
ll nex[MAXN],f[4],g[4];
string a[2],s,cc;
inline void KMP(string b)
{
ll j=-1;ans=0;
for(ui ll i=0;i<b.size();++i)
{
while(j!=-1&&s[j+1]!=b[i])j=nex[j];
if(b[i]==s[j+1])++j;
if(j==(ll)s.size()-1){j=nex[j];++ans;}
}
}
struct wy
{
ll a[4][4];
wy(){memset(a,0,sizeof(a));}
inline wy friend operator *(wy a,wy b)
{
wy c;
rep(0,3,i)rep(0,3,j)rep(0,3,k)
c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j])%mod;
return c;
}
inline wy friend operator ^(wy a,ll p)
{
while(p)
{
if(p&1)
{
rep(0,3,i)g[i]=f[i],f[i]=0;
rep(0,3,i)rep(0,3,j)f[i]=(f[i]+a.a[j][i]*g[j])%mod;
}
p=p>>1;a=a*a;
}
return a;
}
}T;
signed main()
{
//freopen("1.in","r",stdin);
ios::sync_with_stdio(false);
cin>>n;cin>>a[0];cin>>a[1];cin>>s;
memset(nex,-1,sizeof(nex));
ll j=-1;
for(ui ll i=1;i<s.size();++i)
{
while(j!=-1&&s[j+1]!=s[i])j=nex[j];
if(s[j+1]==s[i])++j;
nex[i]=j;
}
if(n==1){KMP(a[0]);putl(ans);return 0;}
if(n==2){KMP(a[1]);putl(ans);return 0;}
ll w1=0,w2=1;//putl(ww);
while(a[0].size()<s.size()||a[1].size()<s.size())
{
a[w1]=a[w1]+a[w2];
swap(w1,w2);++ww;
if(ww==n){KMP(a[w2]);putl(ans);return 0;}
}
//求出递推常数 d1和d2.偶数为 w2+w1 奇数为w2+w2;
//cout<<a[w1]<<' '<<a[w2]<<endl;putl(ww);
ll kk=a[w2].size()-s.size()+1;
for(ui i=kk;i<a[w2].size();++i)cc+=a[w2][i];
for(ui i=0;i<s.size()-1;++i)cc+=a[w2][i];
//cout<<cc<<endl;
KMP(cc);d1=ans;cc="";//putl(ans);
for(ui i=kk;i<a[w2].size();++i)cc+=a[w2][i];
for(ui i=0;i<s.size()-1;++i)cc+=a[w1][i];
//cout<<cc<<endl;
KMP(cc);d2=ans;cc="";//putl(ans);
a[w1]=a[w1]+a[w2];++ww;
swap(w1,w2);
KMP(a[w1]);f[0]=ans;
KMP(a[w2]);f[1]=ans;
if(ww==n){putl(f[1]);return 0;}
n-=ww;f[2]=d2;f[3]=d1;
T.a[0][1]=T.a[1][0]=T.a[1][1]=T.a[2][1]=T.a[2][3]=T.a[3][2]=1;
T=T^n;putl(f[1]);return 0;
}

牛客练习赛63 牛牛的斐波那契字符串 矩阵乘法 KMP的更多相关文章

  1. 斐波那契数列 矩阵乘法优化DP

    斐波那契数列 矩阵乘法优化DP 求\(f(n) \%1000000007​\),\(n\le 10^{18}​\) 矩阵乘法:\(i\times k\)的矩阵\(A\)乘\(k\times j\)的矩 ...

  2. 关于斐波那契数列的一些恒等式 模板 牛客OI测试赛 A 斐波拉契

    牛客A 斐波拉契 链接:https://www.nowcoder.com/acm/contest/181/A来源:牛客网 设f[i]表示斐波那契数论的第i项 f[1]=1,f[2] =1,f[i] = ...

  3. 洛谷P1962 斐波那契数列 || P1349 广义斐波那契数列[矩阵乘法]

    P1962 斐波那契数列 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数 ...

  4. P1349 广义斐波那契数列(矩阵乘法)

    题目 P1349 广义斐波那契数列 解析 把普通的矩阵乘法求斐波那契数列改一改,随便一推就出来了 \[\begin{bmatrix}f_2\\f_1 \end{bmatrix}\begin{bmatr ...

  5. Cogs 1708. 斐波那契平方和(矩阵乘法)

    斐波那契平方和 ★★☆ 输入文件:fibsqr.in 输出文件:fibsqr.out 简单对比 时间限制:0.5 s 内存限制:128 MB [题目描述] ,对 1000000007 取模.F0=0, ...

  6. Codevs 1574 广义斐波那契数列(矩阵乘法)

    1574 广义斐波那契数列 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 广义的斐波那契数列是指形如an=p*an-1+q* ...

  7. [codevs]1250斐波那契数列<矩阵乘法&快速幂>

    题目描述 Description 定义:f0=f1=1, fn=fn-1+fn-2(n>=2).{fi}称为Fibonacci数列. 输入n,求fn mod q.其中1<=q<=30 ...

  8. 牛客练习赛63 牛牛的树行棋 差分 树上博弈 sg函数

    LINK:牛牛的树行棋 本来是不打算写题解的. 不过具体思考 还是有一段时间的. 看完题 一直想转换到阶梯NIM的模型上 转换失败. 考虑SG函数. 容易发现 SG函数\(sg_x=max{sg_{t ...

  9. 4.17 斐波那契数列 K维斐波那契数列 矩阵乘法 构造

    一道矩阵乘法的神题 早上的时候我开挂了 想了2h想出来了. 关于这道题我推了很多矩阵 最终推出两个核心矩阵 发现这两个矩阵放在一起做快速幂就行了. 当k==1时 显然的矩阵乘法 多开一个位置维护前缀和 ...

随机推荐

  1. 基于 React 开发了一个 Markdown 文档站点生成工具

    Create React Doc 是一个使用 React 的 markdown 文档站点生成工具.就像 create-react-app 一样,开发者可以使用 Create React Doc 来开发 ...

  2. 6.28日模拟考试总结(T1:翻转游戏;T2:抢掠计划,T3:测绘,T4:奖学金)

    今天的考试有结束了,又一次被右边的同桌虐了(额,排名第三的大佬)但是考试还是进步了一名,算是有进步吧 成绩: 那个12名就是我,一个AC都没有,太难受了. T1: 题目链接:http://hzoi.c ...

  3. Uni-app实战项目注意事项

    注意: (1)本地开启端口 App running at: Local: http://localhost:8080/ Network: http://192.168.31.43:8080/ 后台人员 ...

  4. 获取本机SqlServer名称

    using System.Data.Sql; //检索包含有关可用SQL Server实例的信息的表,必须先使用共享/静态Instance属性来检索枚举器 SqlDataSourceEnumerato ...

  5. 我终于弄懂了Python的装饰器(四)

    此系列文档: 1. 我终于弄懂了Python的装饰器(一) 2. 我终于弄懂了Python的装饰器(二) 3. 我终于弄懂了Python的装饰器(三) 4. 我终于弄懂了Python的装饰器(四) 四 ...

  6. Python-02 可视化之tkinter介绍

    1 控件介绍 1.1 Label import tkinter as tk # 使用Tkinter前需要先导入 window = tk.Tk() window.title('My Window') w ...

  7. java 基本语法(二) 变量的使用(重点)

    1.变量的分类1.1 按数据类型分类 详细说明://1. 整型:byte(1字节=8bit) \ short(2字节) \ int(4字节) \ long(8字节) //① byte范围:-128 ~ ...

  8. Java8——方法引用

    方法引用就是通过类名或方法名引用已经存在的方法来简化lambda表达式.那么什么时候需要用方法引用呢?如果lamdba体中的内容已经有方法实现了,我们就可以使用方法引用. 一.方法引用的三种语法格式 ...

  9. MVC + EFCore 项目实战 - 数仓管理系统4 – 需求分解

    上次课程我们完成了项目基本的UI风格配置. 现在就开始进入我们的需求开发,我们先捋一下需求. 一.总体需求说明 项目背景第一篇文章已有介绍,我们回顾一下. 这是一个数据管理"工具类" ...

  10. bzoj1673[Usaco2005 Dec]Scales 天平*

    bzoj1673[Usaco2005 Dec]Scales 天平 题意: n个砝码,每个砝码重量大于前两个砝码质量和,天平承重为c,求天平上最多可放多种的砝码.n≤1000,c≤2^30. 题解: 斐 ...