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

    Neo4j 官网地址:https://neo4j.com/ 下载地址:https://neo4j.com/download-center/#community 官方入门文档:https://neo4j ...

  2. Spring Boot引入Swagger并对界面进行美化

    Swagger是一个接口文档生成工具,在前后端分离的开发中经常会用到,下面就来介绍下Swagger的使用: 引入依赖 <dependency> <groupId>io.spri ...

  3. 【Java技术专题】「性能优化系列」针对Java对象压缩及序列化技术的探索之路

    序列化和反序列化 序列化就是指把对象转换为字节码: 对象传递和保存时,保证对象的完整性和可传递性.把对象转换为有字节码,以便在网络上传输或保存在本地文件中: 反序列化就是指把字节码恢复为对象: 根据字 ...

  4. MC-BE基岩版服务器搭建与日常维护

    有部分内容被csdn和谐,强烈建议移步我的个人博客以获得更好的排版和阅读体验: xzajyjs.cn. 目录 环境搭建 开始部署 日常维护 服务器的白名单机制 定时备份 服务器升级 服务器模组安装 搭 ...

  5. 一个小众搞笑的xss漏洞练习平台

    XSS是当今网络安全事件中数量最多的攻击方式,虽然其危害性不高,但主要和其他攻击手段相结合,以实现一个复杂的攻击场景.那么,XSS是什么? XSS全称跨站脚本(Cross Site Scripting ...

  6. UI BLOCK自定义枚举控件的宽度

    三步: 1.修改PresentationStyle属性为Radio Box 2.修改NumberOfColumns属性为指定的宽度(显示字符的个数) 3.将PresentationStyle属性改回O ...

  7. NX Open 图层说

    我也是偶然发现的,在一次调试下,竟然会报警. 所以我写了测试代码,进行测试:结果如下 纳尼???还有271层?还能设置大于256层?NX open可以的.

  8. 第五课第四周笔记4:Transformer Network变压器网络

    Transformer Network变压器网络 你已经了解了 self attention,你已经了解了 multi headed attention.在这个视频中,让我们把它们放在一起来构建一个变 ...

  9. VS2015+OpenCV+Qt

    VS2015+OpenCV+Qt 01.OpenCV 下载 进入官网链接: https://opencv.org,下载所需要的版本: 下载完成后直接双击,选择解压路径,解压到响应的文件夹中: 若之后需 ...

  10. 百度OCR技术博客

    百度OCR工具链使用 百度OCR的API使用总体来说比较容易,主要步骤为:注册云平台并登录,选择服务并创建应用,保存API Key以及Secret Key,选择调用API. 注册登录百度云平台 首先需 ...