两种构造的方式都是正确的;

1.

#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 60
#define ll long long
using namespace std;
int x;
ll M,n;
struct matrix
{
int len_x;
int len_y;
ll data[maxn][maxn];
void ini()
{
len_x=;
len_y=;
memset(data,,sizeof data);
}
}; matrix mat_big;
ll f[maxn][maxn];
matrix s; matrix mat_mul(matrix mat,matrix t)
{
matrix ans;
ans.ini();
ans.len_x=mat.len_x;
ans.len_y=t.len_y;
for(int i=; i<mat.len_x; i++)
{
for(int j=; j<t.len_y; j++)
{
for(int k=; k<mat.len_y; k++)
{
ans.data[i][j]+=(mat.data[i][k]*t.data[k][j])%M;
ans.data[i][j]%=M;
}
}
}
return ans;
} int main()
{
f[][]=;
for(int i=; i<maxn; i++)
for(int j=; j<=i; j++)
{
f[i][j]=f[i-][j]+f[i-][j-];
}
while(scanf("%lld%d%lld",&n,&x,&M)&&n!=-)
{
mat_big.ini();
mat_big.len_x=x+;
mat_big.len_y=x+;
for(int i=; i<=x; i++)
for(int j=; j<=i; j++)
{
mat_big.data[i][j]=x*f[i][j];
if(mat_big.data[i][j]>M)mat_big.data[i][j]%=M;
}
// for(int i=0; i<=x; i++)
// mat_big.data[x+1][i]=mat_big.data[x][i];
mat_big.data[x+][x+]=;
mat_big.data[x+][x]=;
s.ini();
s.len_y=;
s.len_x=x+;
s.data[][]=;
s.data[x+][]=;
// for(int i=0;i<=x+1;i++)
// s.data[i][0]=1;
matrix ret;
ret.ini();
ret.len_x=x+;
ret.len_y=x+;
for(int i=; i<ret.len_x; i++)
ret.data[i][i]=;
n++;
while(n)
{
if(n&)ret=mat_mul(ret,mat_big);
n>>=;
mat_big=mat_mul(mat_big,mat_big);
}
matrix ans=mat_mul(ret,s);
printf("%lld\n",ans.data[x+][]);
}
return ;
}

2.

#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 60
#define ll long long
using namespace std;
int x;
ll M,n;
struct matrix
{
int len_x;
int len_y;
ll data[maxn][maxn];
void ini()
{
len_x=;
len_y=;
memset(data,,sizeof data);
}
}; matrix mat_big;
ll f[maxn][maxn];
matrix s; matrix mat_mul(matrix mat,matrix t)
{
matrix ans;
ans.ini();
ans.len_x=mat.len_x;
ans.len_y=t.len_y;
for(int i=; i<mat.len_x; i++)
{
for(int j=; j<t.len_y; j++)
{
for(int k=; k<mat.len_y; k++)
{
ans.data[i][j]+=(mat.data[i][k]*t.data[k][j])%M;
ans.data[i][j]%=M;
}
}
}
return ans;
} int main()
{
f[][]=;
for(int i=; i<maxn; i++)
for(int j=; j<=i; j++)
{
f[i][j]=f[i-][j]+f[i-][j-];
}
while(scanf("%lld%d%lld",&n,&x,&M)&&n!=-)
{
mat_big.ini();
mat_big.len_x=x+;
mat_big.len_y=x+;
for(int i=; i<=x; i++)
for(int j=; j<=i; j++)
{
mat_big.data[i][j]=x*f[i][j];
if(mat_big.data[i][j]>M)mat_big.data[i][j]%=M;
}
for(int i=; i<=x; i++)
mat_big.data[x+][i]=mat_big.data[x][i];
mat_big.data[x+][x+]=;
// mat_big.data[x+1][x]=1;
s.ini();
s.len_y=;
s.len_x=x+;
s.data[][]=;
s.data[x+][]=;
// for(int i=0;i<=x+1;i++)
// s.data[i][0]=1;
matrix ret;
ret.ini();
ret.len_x=x+;
ret.len_y=x+;
for(int i=; i<ret.len_x; i++)
ret.data[i][i]=;
while(n)
{
if(n&)ret=mat_mul(ret,mat_big);
n>>=;
mat_big=mat_mul(mat_big,mat_big);
}
matrix ans=mat_mul(ret,s);
printf("%lld\n",ans.data[x+][]);
}
return ;
}

最新文章

  1. Swagger-API测试工具实战
  2. Python面试题
  3. C# final project
  4. TextView 跑马灯
  5. Python学习总结5:数据类型及转换
  6. APP store 官方统计工具的常见的Q&amp;A
  7. Java Hashtable类
  8. 关于IOS9更新的适应与适配
  9. 百度编辑器ueditor简单易用
  10. 【视频】零基础学Android开发:蓝牙聊天室APP(二)
  11. CSS3 filter(滤镜) 属性
  12. LPC2478的GPIO使用详解
  13. Java基础学习笔记四 Java基础语法
  14. 谈谈websocket集群的解决方式
  15. socket、web socket
  16. 黄聪:TortoiseGit(乌龟git)保存用户名密码的方法
  17. Mac系统 MAMP 集成环境下搭建 Redis
  18. L1-037 A除以B
  19. Python学习札记(三十九) 面向对象编程 Object Oriented Program 10
  20. 保卫萝卜官方PC版——含绿色版 V1.0.6Beta

热门文章

  1. JavaScript检测实例属性, 原型属性
  2. 理解Java的引用对象
  3. shell脚本实例(2)
  4. php连接Access数据库的三种方法
  5. 使用asp.net上传图片并且裁剪的方法
  6. Google Map JavaScript API V3 实例大全
  7. 第二十四篇、iOS 10版本适配
  8. JavaScript学习笔记(1)——JavaScript简介
  9. 在不同版本的 IIS 上使用 ASP.NET MVC
  10. (转)Quartz.NET管理类