[表达式求值 矩阵乘法] ZROI 2017提高10A. Calc
2017-11-04 16:18
330 查看
神思路,第一次见到这种操作…
构造矩阵来进行状态的转移。
A+B∗C ,我们记3元组 (S,M,T) 表示当前状态,其中S=A, M=B, T=B∗C。
这样记录,每多一个字符,转移可以表示成乘上一个矩阵。
数字 k : (S,M,T)→(S,M,T∗10+M∗k)
+ : (S,M,T)→(S+T,1,0)
− : (S,M,T)→(S,T,0)
矩阵快速幂优化。
构造矩阵来进行状态的转移。
A+B∗C ,我们记3元组 (S,M,T) 表示当前状态,其中S=A, M=B, T=B∗C。
这样记录,每多一个字符,转移可以表示成乘上一个矩阵。
数字 k : (S,M,T)→(S,M,T∗10+M∗k)
+ : (S,M,T)→(S+T,1,0)
− : (S,M,T)→(S,T,0)
矩阵快速幂优化。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long LL; const int maxn=100005,MOD=998244353; struct Matrix{ int n,m,a[5][5]; Matrix(int x=0){ memset(a,0,sizeof(a)); a[0][0]=a[1][1]=a[2][2]=a[3][3]=x; } Matrix operator * (const Matrix &b)const{ Matrix c; c.n=n; c.m=b.m; for(int i=0;i<=c.n-1;i++) for(int j=0;j<=c.m-1;j++) for(int k=0;k<=m-1;k++) (c.a[i][j]+=(LL)a[i][k]*b.a[k][j]%MOD)%=MOD; return c; } } ans; int n; Matrix getM(char ch){ Matrix c; c.n=c.m=4; if(ch=='+') c.a[0][0]=c.a[2][0]=c.a[3][1]=c.a[3][3]=1; else if(ch=='*') c.a[0][0]=c.a[2][1]=c.a[3][3]=1; else c.a[0][0]=c.a[1][1]=c.a[3][3]=1, c.a[2][2]=10, c.a[1][2]=ch-'0'; return c; } char st[20]; Matrix Pow(Matrix a,int b){ Matrix res=1; res.n=res.m=4; for(;b;b>>=1,a=a*a) if(b&1) res=res*a; return res; } int main(){ freopen("zroi10A.in","r",stdin); freopen("zroi10A.out","w",stdout); scanf("%d",&n); ans=0; ans.n=1; ans.m=4; ans.a[0][1]=ans.a[0][3]=1; for(int i=1;i<=n;i++){ int x; scanf("%d%s",&x,st+1); int len=strlen(st+1); Matrix res=1; res.n=res.m=4; for(int i=1;i<=len;i++) res=res*getM(st[i]); ans=ans*Pow(res,x); } ans=ans*getM('+'); printf("%d\n",ans.a[0][0]); return 0; };
相关文章推荐
- 【JZOJ5335】【NOIP2017提高组模拟】早苗(DP、矩阵乘法)
- 【jzoj5335】【NOIP2017提高A组模拟8.24】【早苗】【矩阵乘法快速幂】
- [DP] ZROI 2017 提高3 T3 建筑
- 算法提高 矩阵乘法 蓝桥杯
- 蓝桥杯算法提高 递推求值 【矩阵快速幂】
- 算法提高 矩阵乘法
- BZOJ 4870 [Shoi2017]组合数问题 ——动态规划 矩阵乘法
- cpu gpu做矩阵乘法效率比对,虽然如此,但是对需要自己做的算法是否能如此高效的提高还是未知
- 【BZOJ4870】[Shoi2017]组合数问题 动态规划(矩阵乘法)
- [DP] ZROI 2017 提高6 T2 异或统计
- 蓝桥杯 算法提高 矩阵乘法 (区间dp)
- 奇怪的表达式求值--网易2017春招实习笔试编程题8
- 算法提高 矩阵乘法
- 蓝桥杯 算法提高 矩阵乘法 (区间DP: 最优矩阵连乘)
- 【网易2017春招】奇怪的表达式求值 解题报告
- 算法提高 矩阵乘法 区间DP
- bzoj 4818 [Sdoi2017]序列计数 矩阵乘法优化dp+容斥
- noip2013 表达式求值 (表达式求值加法与乘法)
- 【NOIP2016提高A组模拟9.24】天使的分裂 (矩阵乘法)
- 算法提高 矩阵乘法(90分)