对于题中的"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. mybatis 配置问题查找

    mybatis配置问题记录 org.apache.ibatis.binding.BindingException: Type interface com.xx.dao.UserDao(自己项目的文件) ...

  2. Redis大集群扩容性能优化实践

    一.背景 在现网环境,一些使用Redis集群的业务随着业务量的上涨,往往需要进行节点扩容操作. 之前有了解到运维同学对一些节点数比较大的Redis集群进行扩容操作后,业务侧反映集群性能下降,具体表现在 ...

  3. MeteoInfo-Java解析与绘图教程(五)

    MeteoInfo-Java解析与绘图教程(五) 最近太忙了,终于有时间继续写了,上文说到了基本上的绘图方法,但缺少色阶呈现,一般图叠加着地图上,后端不需要管色阶,但也要注意web页面色阶和我们的生成 ...

  4. PG集群(PostgreSql环境)搭建

    centos PG集群搭建 一.安装PG 1.安装之前首先查看软件是否已经安装 rpm -qa | grep postgresql #若存在,需要卸载使用 yum remove postgresql ...

  5. 用C++实现的数独解题程序 SudokuSolver 2.4 及实例分析

    SudokuSolver 2.4 程序实现 本次版本实现了 用C++实现的数独解题程序 SudokuSolver 2.3 及实例分析 里发现的第三个不完全收缩 grp 算法 thirdGreenWor ...

  6. 初学Python-day11 函数4

    函数 1.递归函数 自己不断调用自己的过程 2.递归求和 1 def sum(arg): 2 if arg == 1: 3 return 1 4 return arg + sum(arg - 1) 5 ...

  7. jq问题

    <div id="box"> <p> <span>A</span> <span>B</span> </ ...

  8. 用例圖學習實例 / Learning Use Case Diagram by Examples

    什麼是用例圖? 用例描述了一個演員和感興趣的系統之間的一系列交互,以達到某種特定目標,並由某種觸發事件引發.用例滿足需求或為演員解決問題.用例圖包含一組用例,可以通過從每個角色的不同角度講述系統將如何 ...

  9. [技术博客]使用pylint实现django项目的代码风格检查

    使用pylint实现django项目的代码风格检查 前言 ​ 一个项目大多都是由一个团队来完成,如果没有统一的代码规范,那么每个人的代码的风格必定会有很大的差别.且不说会存在多个人同时开发同一模块的情 ...

  10. RSA加密——前端JSEncrypt

    RSA加密--前端JSEncrypt 介绍 ​ JSEncrypt是一个RSA加密库,在没有SSL加密传输通道支持https协议的情况下,该库可以在http传输重要信息如时,保证数据的安全性.我们小组 ...