[HNOI2011][BZOJ2326] 数学作业|动态规划|矩阵乘法|快速乘
2015-08-17 20:28
537 查看
2326: [HNOI2011]数学作业
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1388 Solved: 799
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
Sample Output
HINT
Source
矩阵乘法#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> #define ll long long using namespace std; ll n,m,a[4][4],b[4][4]; ll mu(ll x,ll y) { ll s=0; while (y) { if (y&1) s=(s+x)%m; x=(x<<1)%m; y>>=1; } return s; } void mul(ll a[4][4],ll b[4][4],ll ans[4][4]) { ll t[4][4]; for (int i=1;i<=3;i++) for (int j=1;j<=3;j++) { t[i][j]=0; for (int k=1;k<=3;k++) t[i][j]=(t[i][j]+mu(a[i][k],b[k][j]))%m; } for (int i=1;i<=3;i++) for (int j=1;j<=3;j++) ans[i][j]=t[i][j]; } void cal(ll t,ll last) { memset(b,0,sizeof(b)); b[1][1]=t; b[2][1]=b[2][2]=b[3][1]=b[3][2]=b[3][3]=1; ll y=last-t/10+1; while (y) { if (y&1) mul(a,b,a); mul(b,b,b); y>>=1; } } int main() { scanf("%lld%lld",&n,&m); for (int i=1;i<=3;i++) a[i][i]=1; ll t=10; while (n>=t) { cal(t,t-1); t*=10; } cal(t,n); printf("%lld",a[3][1]); return 0; }
相关文章推荐
- android实现Socket通信一
- Java Prim算法
- 编程之美2015初赛第一场 hihoCoder #1156 : 彩色的树(染色问题)
- Android动画学习笔记-Android Animation
- PHP获取Cookie模拟登录CURL
- MyEclipse 快捷键
- 负频率的解释
- Word Ladder I
- [JavaWeb基础] 011.Struts2 配置拦截器
- 一定要注意特殊情况!!!POJ1845
- HDU 1874 畅通工程续【最短路 dijkstra & floyed & SPFA 】
- 3
- linux 随笔-001
- Unable to locate Spring NamespaceHandler for XML schema namespace [http://cxf.apache.org/jaxws]
- Borg论文翻译 以及部分理解
- *怎么使用Delphi获取当前的时间,精确到毫秒
- bzoj1007【hnoi2008】水平可见直线
- GDOI模拟 蜘蛛侠
- oracle里面的时间转字符串to_char(),字符串转时间to_date(),以及substr和instr的使用。
- TweenMax参数补充