bzoj2326 数学作业 矩阵乘法
2015-12-20 16:46
316 查看
这道题目的递推式为f(i)=f(i-1)*10^k+i,因为和i有关系,所以一开始我不知道怎么做。后来翻了题解才知道,原来可以在矩阵里把i也构造进去。构造矩阵乘法如下:
(f(i) , i , 1)=(f(i-1), i-1, 1)*((10^k , 0 , 0),(1 , 1 , 0),(1 , 1 , 1)),其中k为i的位数。然后矩阵乘法直接上就行了。注意当i=0时矩阵为(0 , 0 , 1)。
AC代码如下:
by lych
2015.12.20
(f(i) , i , 1)=(f(i-1), i-1, 1)*((10^k , 0 , 0),(1 , 1 , 0),(1 , 1 , 1)),其中k为i的位数。然后矩阵乘法直接上就行了。注意当i=0时矩阵为(0 , 0 , 1)。
AC代码如下:
#include<iostream> #include<cstdio> #define ll long long using namespace std; struct mtx{ ll p[4][4]; }a,b,c; ll n,mod; mtx tms (mtx x,mtx y){ mtx z; int i,j,k; for (i=1; i<=3; i++) for (j=1; j<=3; j++){ z.p[i][j]=0; for (k=1; k<=3; k++) z.p[i][j]=(z.p[i][j]+x.p[i][k]*y.p[k][j]%mod)%mod; } return z; } int main(){ scanf("%lld%lld",&n,&mod); ll i,j,k; a.p[1][3]=c.p[1][1]=c.p[2][1]=c.p[2][2]=c.p[3][1]=c.p[3][2]=c.p[3][3]=1; for (i=1; i<=n; i=j+1){ j=i*10-1; if (j>n) j=n; c.p[1][1]=c.p[1][1]*(ll)10%mod; b=c; for (k=j-i+1; k; k>>=1){ if (k&1) a=tms(a,b); b=tms(b,b); } } printf("%lld\n",a.p[1][1]%mod); return 0; }
by lych
2015.12.20
相关文章推荐
- TreeView的几个概念
- vb编程学习之路之基础与概念总结
- Audio/Video 标签
- SpringMVC源码阅读(一)
- MY $MYVIMRC
- centos6.5下安装MySQL
- 解决Microsoft OneNote不能登录https://onedrive.live.com的问题
- recyclerView 分隔线 最简实现法
- CentOS Minimal版最小化安装后VMware联网详解
- (转载)常用Git命令清单
- [LeetCode] 303. Range Sum Query - Immutable (Easy)
- HTML5的表单新特性(4)
- C# 中的取整
- UILabel,UIButton,UITextField的简单使用
- video和dvd audio区别:
- HTML5的表单新特性(3)
- 再见Ajax
- 设计模式六大原则
- iOS 之 UITextField
- HTML5表单新特征简介与举例