Codeforces Round #420 (Div. 2) E. Okabe and El Psy Kongroo [矩阵快速幂]

题目无聊到求多次快速幂…

#pragma comment(linker, "/STACK:102400000,102400000")
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<vector>
#include<map>
#include<string>
#include<iostream>
using namespace std;
using namespace std;
typedef long long ll;
const ll mod=1000000007;
int n;
ll m;
struct Matrix
{
    ll mp[20][20];
    Matrix()
    {
        memset(mp,0,sizeof(mp));
    }
};

Matrix mul(Matrix a,Matrix b)
{
    int i,j,k;
    Matrix c;
    for(i=0; i<n; i++)
    {
        for(j=0; j<n; j++)
        {
            c.mp[i][j]=0;
            for(k=0; k<n; k++)
            {
                c.mp[i][j]=(c.mp[i][j]+a.mp[i][k]*b.mp[k][j]%mod)%mod;
            }
        }
    }
    return c;

}

Matrix mypow(Matrix t,ll x)
{
    Matrix c;
    for(int i=0; i<n; i++)
    c.mp[i][i]=1;
    while(x)
    {
        if(x&1)
            c=mul(c,t);
        t=mul(t,t);
        x>>=1;
    }
    return c;

}
long long a[1024],b[1024],c[1024];

int main()
{
    int t;
    long long k;
    n=20;
    scanf("%d %lld",&t,&k);
    for(int i=0;i<t;i++)
    {
       scanf("%lld%lld%lld",a+i,b+i,c+i);
    }
    Matrix A;
    A.mp[0][0]=1;
    for(int p=0;p<t;p++)
    {
        Matrix B;
        for(int i=0;i<=c[p];i++)
        {
            if(i==0)
            {
                B.mp[0][0]=B.mp[1][0]=1;
            }
            else 
                //if(i<=c[p])
            {
                B.mp[i-1][i]=B.mp[i][i]=B.mp[i+1][i]=1;
            }
        }
        //if(a[p]==k) continue;
        //A =mul(A,B);
        //if(min(k,b[p])-a[p]-1<=0) continue;
        if(p) 
        for(int i=min(c[p-1],c[p])+1;i<n;i++) 
            A.mp[0][i]=0; 
        B=mypow(B,min(k,b[p])-a[p]);
        A=mul(A,B);
    }
    printf("%lld\n",A.mp[0][0]);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值