码迷,mamicode.com
首页 > 其他好文 > 详细

vijos Warcraft III 守望者的烦恼

时间:2018-06-17 22:26:51      阅读:234      评论:0      收藏:0      [点我收藏+]

标签:#define   mem   fine   matrix   amp   cpp   代码   IV   scan   

题解

转移方程好写吧
一个一维递推式
然后我们可以构造矩阵优化
嗯,最近学一下递推优化

代码

#include<cstdio>
#include<cstring> 
#include<algorithm> 
#define mod 7777777 
int K,n; 
#define LL long long 
const int maxn = 11; 
struct matrix {
    int a[maxn][maxn];int c,r; 
    void in(int x,int y) { 
        r = x,c = y; 
    } 
    matrix() { 
        c = 0,r = 0; 
        memset(a,0,sizeof a); n = 0 ;
    }   
} ans,tmp; 
matrix operator * (const matrix A,const matrix B) { 
    matrix ret; ret.in(A.r,B.c); 
    for(int i = 0; i < ret.r;++ i) 
        for(int j = 0;j < ret.c;++ j)  
            for(int k = 0;k < A.c;++ k) 
                ret.a[i][j] = (ret.a[i][j] + ((long long )A.a[i][k] * B.a[k][j] % mod) )% mod; 
    return ret; 
} 
int dp[maxn]; 
matrix pow(matrix a,int k) {
    matrix ret; 
    ret.in(K,K); 
    for(int i = 0;i < K;++ i) ret.a[i][i] = 1;
    for(;k;k >>= 1,a = a * a)  
        if(k & 1) ret = ret * a; 
    return ret; 
} 
int main() { 
    scanf("%d%d",&K,&n); 
    tmp.in(K,K); 
    for(int i = 0;i < K;++ i)  tmp.a[i][0] = 1; 
    for(int i = 1;i < K;++ i)  tmp.a[i - 1][i] = 1; 
    tmp = pow(tmp,n); 
    ans.in(1,K); 
    ans.a[0][0] = 1;
    ans = ans * tmp; 
    printf("%lld\n",ans.a[0][0]); 
    return 0; 
} 

vijos Warcraft III 守望者的烦恼

标签:#define   mem   fine   matrix   amp   cpp   代码   IV   scan   

原文地址:https://www.cnblogs.com/sssy/p/9193818.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!