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

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

hdu 3483 A Very Simple Problem的更多相关文章

  1. hdu 5349 MZL's simple problem

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5349 MZL's simple problem Description A simple proble ...

  2. HDU 4267 A Simple Problem with Integers 多个树状数组

    A Simple Problem with Integers Time Limit: 5000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  3. 2015 Multi-University Training Contest 5 hdu 5349 MZL's simple problem

    MZL's simple problem Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...

  4. HDU 3468:A Simple Problem with Integers(线段树+延迟标记)

    A Simple Problem with Integers Case Time Limit: 2000MS Description You have N integers, A1, A2, ... ...

  5. hdu_3483A Very Simple Problem(C(m,n)+快速幂矩阵)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3483 A Very Simple Problem Time Limit: 4000/2000 MS ( ...

  6. 【HDU 3483】 A Very Simple Problem (二项式展开+矩阵加速)

    A Very Simple Problem Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Ot ...

  7. A simple problem 分类: 哈希 HDU 2015-08-06 08:06 1人阅读 评论(0) 收藏

    A simple problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...

  8. A Simple Problem with Integers 多树状数组分割,区间修改,单点求职。 hdu 4267

    A Simple Problem with Integers Time Limit: 5000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  9. HDU 4267 A Simple Problem with Integers

    A Simple Problem with Integers Time Limit: 5000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K ...

随机推荐

  1. 怎样安装WIN7系统

    如何避免win7自动创建200M隐藏分区 1 安装win7到选择安装到哪个分区的时候,不能选择 unallocated diskspace ,也不能选 delete 已有的分区(例如C盘)安全的做法是 ...

  2. jmap命令

    一.jmap -heap PID using parallel threads in the new generation.  ##新生代采用的是并行线程处理方式 using thread-local ...

  3. Nodejs v4.x.0API文档学习(2)Assert断言测试模块

    文档参考地址:https://nodejs.org/dist/latest-v4.x/docs/api/ Assert(断言) assert模块提供了一组简单的断言测试方法,可以拥有测试不变量.该模块 ...

  4. JavaScript高级程序设计(第三版)学习笔记1~5章

    第2章,在html中使用JavaScript Html引入外部js脚本 <script type="text/javascript" src="test.js&qu ...

  5. 使用Log4Net发送日志邮件 (转载)

    前言 公司前几天重新确立了考核指标,主要是针对我们研发部,而我们的经理要求也高,对我们绩效考核扣分也挺狠的,100分的,出了几个严重bug就变 0分,反正只要被用户发现并且提出来了,就会扣分,没被用户 ...

  6. 对list集合中的对象进行排序(转载)

    原文链接:http://blog.csdn.net/veryisjava/article/details/51675036 Collections对List集合中的数据进行排序 有时候需要对集合中的元 ...

  7. 备份BinLog并压缩 全备份

    Rem Backup Mysql Binlog Rem Backup Yesterday and RAR Rem Backup every day 00:01 begin backup yesterd ...

  8. cocos2d-x实战 C++卷 学习笔记--第6章 场景与层

    前言: 一个场景(Scene)是由多个层(Layer)组成,而且层的个数要至少是1,不能为0. 场景切换 场景切换相关函数 1)void  runWithScene(Scene*  scene) 该函 ...

  9. (转) VS2012程序打包部署详解

    程序编写测试完成后接下来我们要做的是打包部署程序,但VS2012让人心痛的是没有了打包工具.不知道出于什么原因微软没有将打包工具集成在开发环境中,但是我知道总会有解决办法的.     经过翻阅资料发现 ...

  10. NodeJs随心学习(一)之UEditor开源项目部署

    作为NodeJs的初学者+6年的码农,我觉得从基础看起太慢了,还是直接上Demo好玩一些. 嗯,直接开玩..今天在GitHub上看到了UEditor之NodeJs版的开源项目激起了我浓厚的兴趣,随后决 ...