博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 2604
阅读量:4983 次
发布时间:2019-06-12

本文共 1317 字,大约阅读时间需要 4 分钟。

矩阵快速幂

设F(N)为字符串为N的时候,符合条件的子字符串数

以字符串最后一个字符为分界点,最后一个字符为m的时候,前N-1个字符没有限制,即为F(N-1);

当最后一个字符串为f的时候,就必须去除最后3个字符是fmf和fff的情况,此时最后3个字符可能为mmf和mff;

当后3个字符为mm时,前N-3个字符没有限制,即F(N-3);

但是当最后3个字符为mff时,后四个字符必须为mmff时前N-4个字符无限制,即为F(N-1);

 

所以递推为F(N)=F(N-1)+F(N-3)+F(N-4);

F0=0 F1=2 F2=4 F3=6 F4=9

1011  F(N-1)  F(N)

1000 F(N-2) =F(N-1)

0100 F(N-3)  F(N-2)

0010 F(N-4)  F(N-3)

 

 

 

#include <iostream>

#include <string.h>
using namespace std;
int n,m;
struct M{                              //矩阵结构体
    int t[4][4];
    M(){
        memset(t,0,sizeof(t));
    }
    void init(){
        t[0][0]=t[0][2]=t[0][3]=t[1][0]=t[2][1]=t[3][2]=1;
    }
    void E(){                              //单位矩阵
        for(int i=0;i<4;i++){
            t[i][i]=1;
        }
    }
};
M multiply(M a,M b){                          //矩阵乘法
    M c;
    for(int i=0;i<4;i++){
        for(int j=0;j<4;j++){
            for(int k=0;k<4;k++){
                c.t[i][j]=(c.t[i][j]+a.t[i][k]*b.t[k][j])%m;
            }
        }
    }
    return c;
}
M powM(M a,int k){                                    //矩阵的幂运算
    M tem;
    tem.E();
    while(k){
        if(k&1)tem=multiply(a,tem);
        a=multiply(a,a);
        k>>=1;
    }
    return tem;
}
int main(){
    int t;
    M a,b,c;
    a.t[0][0]=9;
    a.t[1][0]=6;
    a.t[2][0]=4;
    a.t[3][0]=2;
    b.init();
    while(cin>>n>>m){
        if(n<5){
            if(n==0)cout<<"0"<<endl;
            else cout<<a.t[4-n][0]%m<<endl;
        }
        else {
            c=powM(b,n-4);
            c=multiply(c,a);
            cout<<c.t[0][0]%m<<endl;
        }
    }
    return 0;
}

转载于:https://www.cnblogs.com/Mr-Xu-JH/p/3858109.html

你可能感兴趣的文章
高斯消元模板,整数(数学)
查看>>
bzoj4690: Never Wait for Weights
查看>>
20172324 2017-2018《程序设计与数据结构》第十一周学习总结
查看>>
smartconfig配置模式
查看>>
arcgis按要求删除点位
查看>>
estore商城案例(二)------登录&添加商品&商品列表(上)
查看>>
$ 专治各种python字符编码问题疑难杂症
查看>>
C++ STL 双端队列deque
查看>>
全面了解Nginx到底能做什么
查看>>
TCP三次握手与四次分手
查看>>
spoj839: Optimal Marks
查看>>
2 主要设计思路
查看>>
Wince实现软件开机自启动
查看>>
【BZOJ1106】【POI2007】立方体大作战tet(树状数组+贪心)
查看>>
【Python⑥】python的缩进,条件判断和循环
查看>>
java第九次作业
查看>>
vue 调用 ios提供的方法
查看>>
RapidWeaver 8.3 for Mac 共享版 – 强大的零编码H5网页开发工具
查看>>
2018多校第6场 1013 hdu6373 Pinball
查看>>
《英语修辞与写作(修订版)》黄任(编著)epub+mobi+azw3格式下载
查看>>