[hdu6145]Arithmetic of Bomb II
对于题中的"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的更多相关文章
- 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 ...
- hdu 6144 Arithmetic of Bomb
Arithmetic of Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- 2017百度之星程序设计大赛 - 复赛 Arithmetic of Bomb
http://acm.hdu.edu.cn/showproblem.php?pid=6144 解法:一个简单的模拟 #include <bits/stdc++.h> using names ...
- 【2017"百度之星"程序设计大赛 - 复赛】Arithmetic of Bomb
[链接]http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=777&pid=1001 [题意] 在这里写 [题解] ...
- [SinGuLaRiTy] 2017 百度之星程序设计大赛 复赛
[SinGuLaRiTy-1038] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. Arithmetic of Bomb Problem D ...
- 2017"百度之星"程序设计大赛 - 复赛
Arithmetic of Bomb Accepts: 1050 Submissions: 1762 Time Limit: 2000/1000 MS (Java/Others) Memory ...
- 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 ...
- 2017"百度之星"程序设计大赛 - 复赛 01,03,05
Arithmetic of Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- Arithmetic Slices II - Subsequence LT446
446. Arithmetic Slices II - Subsequence Hard A sequence of numbers is called arithmetic if it consis ...
随机推荐
- 2021.8.14考试总结[NOIP模拟39]
T1 打地鼠 全场就俩人没切,还有一个是忘关$freopen$了. $code:$ 1 #include<bits/stdc++.h> 2 #define rin register sig ...
- 单片机入门stm32知识学习的先后顺序
这里大概的罗列了一些学习STM32的内容,以及学习顺序.如果是新手的话,建议边看中文手册和学习视频;如果是已经入门的,个人建议自己做一个项目,不论项目大小,当然里面会涉及到自己已经学习过的,或者是自己 ...
- iPhone SE切换颜色特效
Apple 网站的特效, iPhone SE 共有黑.白.红三种颜色,在卷动页面的时候会逐步替换,看起来效果非常时尚,在此供上代码学习. <!DOCTYPE html> <html& ...
- 攻防世界 杂项13.can_has_stdio?
打开发现是由trainfuck编码组成的小星星阵容,果断交给解密网站进行解密, 解密网站:http://ctf.ssleye.com/brain.html flag:flag{esolangs_for ...
- 嵌入式开发板nfs挂载
板子要开始调试了,第一个头大的问题就是调试过程中更新的文件怎么更新到板子上,以前用sd卡拷贝来来回回太浪费时间了,adb也需要接线各种连接操作. 现在板子有wifi可用,是时候把nfs共享搭起来了. ...
- 第K个数 牛客网 程序员面试金典 C++ Python
第K个数 牛客网 程序员面试金典 C++ Python 题目描述 有一些数的素因子只有3.5.7,请设计一个算法,找出其中的第k个数. 给定一个数int k,请返回第k个数.保证k小于等于100. 测 ...
- hdu 4288 Coder (线段树+离线)
题意: 刚开始有一个空集合.有三种操作: 1.往集合中加入一个集合中不存在的数 x 2.从集合中删除一个已经存在的数 x 3.计算集合的digest sum并输出. digest sum求 ...
- cf Two Sets (我用二分最大匹配做的)
题意: n个数p1,p2....pn 两个数a,b 把它们分成A,B两个集合. 若x属于A,a-x一定属于A. 若x属于B,b-x一定属于B. 问是否可能将这n个数分成两个集合.若可以,输出每 ...
- Openeuler安装完整man手册
Openeuler安装完整man手册 在 Debian 和 Ubuntu 中安装了Shell 前端软件包管理器apt(Advanced Packaging Tool),可以通过如下方式安装. ...
- Centos 7 编译安装llvm 8.0.0
参考连接:https://www.cnblogs.com/BinBinStory/p/7499527.html https://blog.csdn.net/llwy1428/article/detai ...