ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[hdu6145]Arithmetic of Bomb II

2021-10-12 14:34:30  阅读:167  来源: 互联网

标签:Bomb matrix bc hdu6145 ll 三元组 II int define


对于题中的"normal expression"(仅含加减乘和无前导0的非负整数,无括号)的计算,实际上并不需要通常的表达式求值,而可以用下述方式计算——

维护三元组$(a,b,c)$,分别表示已经确定的部分、下一个$\pm$之前这些数的系数和当前最后一个数字(或许解释并不清晰,可以参考转移),三者初始为$(0,1,0)$,并不断加入下一个字符$d$,转移如下
$$
\begin{cases}a'=a+bc,b'=1,c'=0&(+)\\a'=a+bc,b'=-1,c'=0&(-)\\a'=a,b'=bc,c'=0&(*)\\a'=a,b'=b,c'=10c+d&(num)\end{cases}
$$
再额外维护一个$bc$后,转移即均为线性,那么可以用矩阵描述

(具体实现还要再维护一个1,因此矩阵大小为$5\times 5$)

另外,若最终得到的三元组为$(a,b,c)$,则答案即为$a+bc$

最终,总复杂度为$o(5^{3}tl)$,可以通过

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define N 300005
 4 #define mod 1000000007
 5 #define ll long long
 6 int t,n,flag;
 7 ll m;
 8 char s[N];
 9 struct matrix{
10     int a[5][5];
11     matrix(int p=0){
12         memset(a,0,sizeof(a));
13         for(int i=0;i<5;i++)a[i][i]=p;
14     }
15 }o,ans,A[13];
16 int change(char c){
17     if (c=='+')return 10;
18     if (c=='-')return 11;
19     if (c=='*')return 12;
20     return c-'0';
21 }
22 matrix mul(matrix a,matrix b){
23     matrix ans;
24     for(int i=0;i<5;i++)
25         for(int j=0;j<5;j++)
26             for(int k=0;k<5;k++)ans.a[i][j]=(ans.a[i][j]+(ll)a.a[i][k]*b.a[k][j])%mod;
27     return ans;
28 }
29 matrix qpow(matrix a,ll m){
30     matrix s=a,ans(1);
31     while (m){
32         if (m&1)ans=mul(ans,s);
33         s=mul(s,s);
34         m>>=1;
35     }
36     return ans;
37 }
38 int main(){
39     for(int i=0;i<10;i++){
40         A[i].a[0][0]=A[i].a[1][1]=A[i].a[2][2]=1;
41         A[i].a[0][3]=A[i].a[2][4]=i;
42         A[i].a[3][3]=A[i].a[4][4]=10;
43     }
44     A[10].a[0][0]=A[10].a[1][1]=A[10].a[4][1]=A[10].a[0][2]=1;
45     A[11]=A[10],A[11].a[0][2]=mod-1;
46     A[12].a[0][0]=A[12].a[1][1]=A[12].a[4][2]=1;
47     scanf("%d",&t);
48     while (t--){
49         scanf("%s",s);
50         n=strlen(s),flag=0,ans=matrix(1);
51         for(int i=0;i<n;i++){
52             if (flag){
53                 if (s[i]=='('){
54                     m=0;
55                     continue;
56                 }
57                 if (s[i]!=')')m=m*10+s[i]-'0';
58                 else{
59                     ans=mul(o,qpow(ans,m));
60                     flag=0;
61                 }
62                 continue;
63             }
64             if (s[i]=='('){
65                 o=ans,ans=matrix(1);
66                 continue;
67             }
68             if (s[i]==')')continue;
69             if (s[i]=='#')flag=1;
70             else ans=mul(ans,A[change(s[i])]);
71         }
72         printf("%d\n",((ans.a[0][1]+ans.a[2][1])%mod+(ans.a[0][4]+ans.a[2][4])%mod)%mod);
73     }
74     return 0;
75 }
View Code

 

标签:Bomb,matrix,bc,hdu6145,ll,三元组,II,int,define
来源: https://www.cnblogs.com/PYWBKTDA/p/15397730.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有