VOJ 1067 Warcraft III 守望者的烦恼 (矩阵快速幂+dp)

来源:互联网 发布:3dmax unity3d 编辑:程序博客网 时间:2024/05/18 20:09

题目链接

显然可知

dp[n] = dp[n-k] + dp[n-k+1] + ... +dp[n-1];


然后要用矩阵来优化后面的状态转移。


也就是矩阵

0 1 0 0    a     b

0 0 1 0 * b =  c

0 0 0 1    c     d

1 1 1 1    d    a+b+c+d


然后跑快速幂


#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>#include <cstring>#define N 10using namespace std;const int mod = 7777777;typedef long long LL;struct matrix{    LL a[10][10];}origin;int n,m;matrix multiply(matrix x,matrix y){    matrix temp;    memset(temp.a,0,sizeof(temp.a));    for(int i=0;i<n;i++)    {        for(int j=0;j<n;j++)        {            for(int k=0;k<n;k++)            {                temp.a[i][j]+=x.a[i][k]*y.a[k][j];                temp.a[i][j]=(temp.a[i][j])%mod;            }        }    }    return temp;}matrix matmod(matrix A,int k){    matrix res;    memset(res.a,0,sizeof res.a);    for(int i=0;i<n;i++)res.a[i][i]=1;    while(k)    {        if(k&1)        res=multiply(res,A);        k>>=1;        A=multiply(A,A);    }    return res;}void print(matrix x){    for(int i=0;i<n;i++)    {        for(int j=0;j<n;j++)        cout<<" "<<x.a[i][j];        puts("");    }    printf("---------------\n");}int main(){    int k;    while(cin>>n>>k)    {        memset(origin.a,0,sizeof origin.a);        origin.a[0][0]=1;        for(int i=1;i<=n;i++)        {            origin.a[i][0]=1;            for(int j=0;j<i;j++)            {                origin.a[i][0]+=origin.a[j][0];            }        }       // print(origin);        matrix res;        memset(res.a,0,sizeof res.a);        for(int i=0;i<n-1;i++)        {            res.a[i][i+1]=1;        }        for(int i=0;i<n;i++)res.a[n-1][i]=1;        //print(res);        res=matmod(res,k-1);        LL fans=0;        for(int i=0;i<n;i++)        {            fans+=res.a[0][i]*origin.a[i][0];            fans%=mod;        }        cout<<fans<<endl;    }    return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 g_tk C#网络通信 C语言笔试 ucos qt包含文件 科大讯飞java 1,定义一个接口Assaultable(可攻击的),该接口有一个抽象方法attack()。2,定义一 FlyAudioVoice 2023 编写一个应用程序绘制一个如下的操作菜单并实现功能(定义一个类学生表示学生,有成员变量姓名name和年 Minecraft 1204:剔除相关数 平坦衰落信道2FSK差错性能分析 平坦衰落信道 编写一个应用程序绘制一个如下的操作菜单并实现功能(定义一个类学生表示学生,有成员变量姓名name和年 手机是现在人们必不可少、最重要的通讯工具,拥有一款简单、实用、易用的手机通讯录,将会使你的手机更加好 手机是现在人们必不可少、最重要的通讯工具,拥有一款简单、实用、易用的手机通讯录,将会使你的手机更加好 编写一个应用程序绘制一个如下的操作菜单并实现功能(定义一个类学生表示学生,有成员变量姓名name和年 61858 61850 全国市级城市拼音 pycr rpyc pry 安德地产公司 安德地产年报 pycharm安装 高文 李皓 王煊 赵瀚 夜的命名术 我的治愈系游戏 全职艺术家 星门 长夜余火 不科学御兽 十方武圣 黎明之剑 深空彼岸 稳住别浪