首页 > 其他 > 详细

NKOJ 简单的计算 (矩阵ksm)

时间:2019-08-04 13:26:44      阅读:152      评论:0      收藏:0      [点我收藏+]
时间限制 : - MS   空间限制 : - KB 技术分享图片
评测说明 : 时限1s,空限128m
问题描述

  给你三个整数 N, x, 和 M, 计算下列式子:
技术分享图片

 

注意构造矩阵时的行列

code:

//
#include<bits/stdc++.h>
using namespace std;
#define ll long long 
typedef ll xwz[55][55];
ll n,x,m;

xwz aa;
xwz c;
xwz res;
xwz rres;
ll  ddd[55];
void cheng(xwz ccc,xwz rr)
{
    memset(rres,0,sizeof(rres));
    for(int i=1;i<=x+2;i++)
    for(int j=1;j<=x+2;j++)
    for(int k=1;k<=x+2;k++)
    {
        rres[i][j]=(rres[i][j]%m+((ccc[i][k]%m)*(rr[k][j]%m)))%m;
    }
    memcpy(ccc,rres,sizeof(rres));
}
void ksm(xwz cc)
{
    ll b=n;
    memset(res,0,sizeof(res));
    for(int i=1;i<=x+2;i++) res[i][i]=1;
    while(b)
    {
        if(b&1) cheng(res,cc);
        b>>=1;
        cheng(cc,cc);
    }
    memcpy(cc,res,sizeof(res));
}
int main()
{
    cin>>n>>x>>m;
    for(int i=0;i<=53;i++)
    {
        c[i][0]=1;
    }
    for(int i=1;i<=x+2;i++)
        for(int j=1;j<=i;j++)
        {
            c[i][j]=c[i-1][j]%m+c[i-1][j-1]%m;
        }
    for(int j=1;j<=x+1;j++)
        for(int i=1;i<=j;i++)
        {
                aa[i][j]=(c[j-1][i-1]*x)%m;
        }
    aa[x+1][x+2]=aa[x+2][x+2]=1;
    ksm(aa);
    for(int i=1;i<=x+1;i++)
    {
        ddd[i]=x;
    }
    ll ans=0;
    for(int j=1;j<=x+2;j++)
    {
        ans+=ddd[j]*aa[j][x+2]%m;
    }
//    for(int j=1;j<=x+1;j++)
//    {
//        ans+=ddd[j]*aa[j][x+1]%m;
//    }
    printf("%lld",ans%m);
}

 

 

NKOJ 简单的计算 (矩阵ksm)

原文:https://www.cnblogs.com/OIEREDSION/p/11297667.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!