代码改变世界

Warcraft III 守望者的烦恼

2019-12-03 21:07  一只弱鸡丶  阅读(222)  评论(0编辑  收藏  举报

题目链接:

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

#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;
}