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

Warcraft III 守望者的烦恼

时间:2019-12-03 21:32:28      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:getchar   note   efi   lan   base   c++   https   clu   ase   

题目链接:

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

#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 守望者的烦恼

标签:getchar   note   efi   lan   base   c++   https   clu   ase   

原文地址:https://www.cnblogs.com/acm1ruoji/p/11979452.html

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