Warcraft III 守望者的烦恼

Posted acm1ruoji

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Warcraft III 守望者的烦恼相关的知识,希望对你有一定的参考价值。

题目链接:

这道题跟斐波那契数列类似,快速幂矩阵随便推一推就出来了!

#pragma GCC optimize("O3")
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define re register
#define pb push_back
#define fi first
#define se second
const int N=1e6+10;
const int mod=7777777;
void read(int &a)
{
    a=0;int d=1;char ch;
    while(ch=getchar(),ch>9||ch<0)
        if(ch==-)
            d=-1;
    a=ch^48;
    while(ch=getchar(),ch>=0&&ch<=9)
        a=(a<<3)+(a<<1)+(ch^48);
    a*=d;
}
struct note
{
    int a[15][15];
}ans,a;
int k,n;
note mul(note x,note y)
{
    note c;
    for(re int i=1;i<=k;i++)
    {
        for(re int j=1;j<=k;j++)
        {
            c.a[i][j]=0;
            for(re int l=1;l<=k;l++) c.a[i][j]=(c.a[i][j]+1ll*x.a[i][l]*y.a[l][j]%mod)%mod;
        }
    }
    return c;
}
note quickmod(note x,int y)
{
    note res,base=x;
    for(re int i=1;i<=k;i++)
        for(re int j=1;j<=k;j++)
            res.a[i][j]=i==j?1:0;
    while(y)
    {
        if(y&1) res=mul(res,base);
        base=mul(base,base);
        y>>=1;
    }
    return res;
}
int main()
{
    read(k),read(n);
    if(n<=k)
    {
        ans.a[0][1]=1;
        for(re int i=1;i<=n;i++) for(re int j=0;j<i;j++) ans.a[i][1]+=ans.a[j][1];
        return printf("%d",ans.a[n][1]),0;
    }
    for(re int i=1;i<=k;i++) a.a[1][i]=1;
    for(re int i=2;i<=k;i++) a.a[i][i-1]=1;
    ans.a[k+1][1]=1;
    for(re int i=k;i>=1;i--) for(re int j=k+1;j>i;j--) ans.a[i][1]+=ans.a[j][1];
    int m=n-k;
    a=quickmod(a,m);
    ans=mul(a,ans);
    printf("%d",ans.a[1][1]);
    return 0;
}

 

以上是关于Warcraft III 守望者的烦恼的主要内容,如果未能解决你的问题,请参考以下文章

Vijos 1067Warcraft III 守望者的烦恼

[Vijos1067]Warcraft III 守望者的烦恼(DP + 矩阵优化)

[矩阵乘法][DP]Vijos1067 Warcraft III 守望者的烦恼

矩阵经典题目七:Warcraft III 守望者的烦恼(矩阵加速递推)

守望者的烦恼

JGUI源码:实现图标按钮及下拉菜单(16)