Description
Bessie研制出了一种新的编程语言,但是因为还没有设计编译器的缘故,她需要你的帮助来运行她编的程序。
COWBASIC语言是一种简单的、优美的语言。它有两个关键功能:变量相加和MOO循环。对于可能的溢出问题,Bessie想出了一个很好的方法,所有的变量加法都要以10^9+7为模。但是Bessie设计的COWBASIC语言中真正成功之处是可以运行一段固定数量的代码的MOO循环。MOO循环和加法是可以嵌套的。
给你一段COWBASIC程序,请你帮助Bessie确定这个程序段将会返回什么数值。
Input
你将会得到一段最长为100行的COWBASIC程序,每行的长度最长为350个字符。COWBASIC语言的结构和类型如下所述:
这是COWBASIC语言的三种主要结构:
<变量>=<表达式> //赋值结构
<数字(循环次数)>MOO{ //循环结构
<一系列的表达式(也就是循环部分)>
} RETURN <变量> //输出结构 把return的变量输出就行了
这是COWBASIC语言的三种类型(我是这么理解的)
<数字> 这些数字是小于100,000正整数
<变量> 这些变量名字是一串10个以内的小写英文字母
(<表达式>)+(<表达式>) //注意:这是COWBASIC中变量加法的表达方法,详见样例
我们保证返回的变量是已定义的,RETURN(输出结构)将只会出现一次且在程序的最后一行。
Output
输出返回的变量值(有符号的整形数字)
Sample Input
输入样例1:
x = 1
10 MOO {
x = ( x ) + ( x )
}
RETURN x
输入样例2:
n = 1
nsq = 1
100000 MOO {
100000 MOO {
nsq = ( nsq ) + ( ( n ) + ( ( n ) + ( 1 ) ) )
n = ( n ) + ( 1 )
}
}
RETURN nsq
Sample Output
输出样例1:
1024
输出样例2:
4761
Data Constraint
评分标准
20%数据:MOO循环不嵌套
另外20%数据:程序只有一个变量,MOO循环可嵌套
其他数据没有多余限制(即最长100行,每行最长350字符)
赛时
表示比赛的时候没太多时间来整这题了。
当时初略的想是一道炒鸡马饭的字符串处理题+矩阵优化。
感觉思路比较简单,写起来3、4k的亚子。
然后就懒得写了
题解
有一说一,我是一个还没写出来就在这里口胡的db。
首先我们可以发现变量出现的次数不会太多,就算太多那么循环也不会太多 (平衡规划,雾
那么我们就把所有的变量都拉出来,假设有n个。
然后我们就可以弄出个n*n的矩阵。
接下来我们就一步一步往循环里面钻。
其中我们可以手动打一个栈来维护,比较方便。
那么假设我们遇到一个没有再嵌套循环的循环(禁止套娃),我们可以把里面的变量之间的相互贡献搞成矩阵的新式。
然后就矩阵快速幂。
那么这样我们就做到了把一个循环给消灭掉了。
接着这样一步一步消灭下去,我们就得到了若干个矩阵。
然后把他们再×起来就差不多可以了。
其实其中主要的困难在于极其繁琐的字符串维护。
(等等,这不能成为你不写的借口。
时间的话其实还是很良心的。
矩阵最大为100,然后每个循环log次最大也是17。
组合起来其实最大也跑不满1亿。
就看常数丑不丑了。
代码
待更