对于题中的"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 }

[hdu6145]Arithmetic of Bomb II的更多相关文章

  1. 2017"百度之星"程序设计大赛 - 复赛1001&&HDU 6144 Arithmetic of Bomb【java大模拟】

    Arithmetic of Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  2. hdu 6144 Arithmetic of Bomb

    Arithmetic of Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  3. 2017百度之星程序设计大赛 - 复赛 Arithmetic of Bomb

    http://acm.hdu.edu.cn/showproblem.php?pid=6144 解法:一个简单的模拟 #include <bits/stdc++.h> using names ...

  4. 【2017"百度之星"程序设计大赛 - 复赛】Arithmetic of Bomb

    [链接]http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=777&pid=1001 [题意] 在这里写 [题解] ...

  5. [SinGuLaRiTy] 2017 百度之星程序设计大赛 复赛

    [SinGuLaRiTy-1038] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. Arithmetic of Bomb Problem D ...

  6. 2017"百度之星"程序设计大赛 - 复赛

    Arithmetic of Bomb  Accepts: 1050  Submissions: 1762  Time Limit: 2000/1000 MS (Java/Others)  Memory ...

  7. oracle已知会导致错误结果的bug列表(Bug Issues Known to cause Wrong Results)

    LAST UPDATE:     1 Dec 15, 2016 APPLIES TO:     1 2 3 4 Oracle Database - Enterprise Edition - Versi ...

  8. 2017"百度之星"程序设计大赛 - 复赛 01,03,05

    Arithmetic of Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  9. Arithmetic Slices II - Subsequence LT446

    446. Arithmetic Slices II - Subsequence Hard A sequence of numbers is called arithmetic if it consis ...

随机推荐

  1. 【Ubuntu】VirtualBox 您没有查看“sf_VirtualDisk”的内容所需的权限

    ​ 但是现在发现无法去访问,没有权限: ​ 即使是: crifan@crifan-Ubuntu:~$ sudo chown -R crifan /media/sf_win7_to_ubuntu/ cr ...

  2. NOIP模拟77

    前言 感觉最近太飘了,这次考试是挺好的一次打击(好像也不算是). 犯了一个智障错误(双向边一倍数组 100pts->30pts)别的就.. T1 最大或 解题思路 一开始我以为是一个找规律,然而 ...

  3. Tomcat 源码环境搭建

    Tomcat 源码搭建 下载源码 下载地址 :https://tomcat.apache.org/download-80.cgi#8.5.35 下载之后解压缩 导入Idea 添加pom.xml文件 & ...

  4. 二、Ansible基础之模块篇

    目录 1. Ansible Ad-Hoc 命令 1.1 命令格式 1.2 模块类型 1.3 联机帮助 1.3.1 常用帮助参数 1.4 常用模块 1.4.1 command & shell 模 ...

  5. CQL和SQL的CRUD操作比较

    数据进行CRUD操作时,CQL语句和SQL语句的异同之处. 1.建表 2.CRUD语句比较 3.总结 1.建表 在此之前先分别创建两张表,插入数据,用来测试然后进行比较 在SQL数据库里面创建表 在C ...

  6. Windows10使用技巧

    Windows10配置技巧 新机配置 "我的电脑"图标设置 在桌面右击鼠标=>个性化=>点击左侧"主题"=>点击相关的设置中的"桌面 ...

  7. 实验6:开源控制器实践——RYU

    实验目的 能够独立部署RYU控制器 能够理解RYU控制器实现软件定义的集线器原理 能够理解RYU控制器实现软件定义的交换机原理 二.实验环境 下载虚拟机软件Oracle VisualBox或VMwar ...

  8. 实验5:开源控制器实践——POX

    一.实验目的 1.能够理解 POX 控制器的工作原理: 2.通过验证POX的forwarding.hub和forwarding.l2_learning模块,初步掌握POX控制器的使用方法: 3.能够运 ...

  9. 小白自制Linux开发板 十. NES游戏玩起来

    本篇基于我们制作的Debian文件系统而展开,而且我们这会玩一些高级的操作方式--用我们的小电脑进行程序编译.   所以本篇操作全部都在我们个的开发板上完成.   1. 开发环境搭建 首先安装gcc, ...

  10. Git新建本地分支

    作为一名码农,Git的使用就像家常便饭,时时刻刻都要用到. 通常我们在开发或者调试某个功能的时候,一般会从主分支新开一个单独的分支仅供自己使用,当我们开发完成后在提交合并请求给管理员,管理员进行代码审 ...