2326: [HNOI2011]数学作业
2016-04-30 09:33
246 查看
矩阵乘法,“10进制分组”
#include<bits/stdc++.h> #define rep(i,k,n) for(int i=k;i<=(n);i++) using namespace std; typedef unsigned long long ll; ll mod;ll n; struct ju{ ll a[4][4];ju(){memset(a,0,sizeof(a));} }ans,tmp; ju operator *(ju a,ju b){ju c; rep(k,1,3)rep(i,1,3)rep(j,1,3)c.a[i][j]=(c.a[i][j]+(1ll*a.a[i][k]*b.a[k][j])%mod)%mod; return c; } void solve(ll k,ll t){ rep(i,1,3)rep(j,1,3)tmp.a[i][j]=0; tmp.a[1][1]=k%mod; tmp.a[2][1]=tmp.a[2][2]=tmp.a[3][1]=tmp.a[3][2]=tmp.a[3][3]=1ll; ll p=t-k/10+1; for(;p;p>>=1){if(p&1)ans=ans*tmp; tmp=tmp*tmp; } } int main(){//freopen("in.in","r",stdin); scanf("%lld%lld",&n,&mod);rep(i,1,3)ans.a[i][i]=1ll; ll t=10; while(t<=n){ solve(t,t-1); t=t*10; } solve(t,n); rep(i,1,3)rep(j,1,3)tmp.a[i][j]=0;tmp.a[1][1]=0,tmp.a[1][2]=0,tmp.a[1][3]=1ll; ans=tmp*ans; printf("%lld\n",ans.a[1][1]); } /*f =f[n-1]*矩阵 矩阵由小到大 f =矩阵*f[n-1] 矩阵由大到小 */
相关文章推荐
- B. Crossed ladders
- git/github初级运用自如 (good)
- 根据二叉树的前序和中序遍历结果,还原二叉树
- iOS - 生成二维码
- Irrlicht学习笔记(3)--CustomSceneNode
- android sdk 下各个文件夹的作用
- 算法练习3.Longest Substring Without Repeating Characters 最长不重复子字符串(map)
- 个人冲刺10
- redis基础
- 宏定义中的"#"、"##"、"..."、"__VA_AGRS__"
- 1002. 写出这个数 (20)
- 第 15 章 CSS 文本样式[下]
- bzoj4310: 跳蚤
- POJ1200 Crazy Search(hash)
- 博客莫名被关,还好及时解决
- ADT之练习题
- 创业分享:创业的过程就是坚持的过程
- tomcat环境变量配置
- 广告行业知识
- phoenix设计