题目大意

给定一个逻辑表达式,求每一个数满足$\in[1,n]$的使的表达式为真的方案数。

题解

题目限制较奇怪且数据范围较小,所以可以考虑直接暴力。

考虑枚举每一个变量一共出现了$k$种数值,再枚举这些数值之间的大小关系,判断是否满足表达式为真的条件,每有一种,答案就$+C_n^k$即可。

为了方便计算应把中缀表达式转化为后缀表达式,具体方法不再赘述。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define mod 1000000007
#define M 1020
#define OR -1
#define AND -2
#define LESS -3
using namespace std;
int read(){
int nm=0,fh=1; int cw=getchar();
for(;!isdigit(cw);cw=getchar()) if(cw=='-') fh=-fh;
for(;isdigit(cw);cw=getchar()) nm=nm*10+(cw-'0');
return nm*fh;
}
int mul(int x,int y){return (LL)x*(LL)y%mod;}
int add(int x,int y){return (x+y)>=mod?(x+y-mod):x+y;}
int n,m,V[M],W[M],K[M],tot,C[M],p[M],top,S[M],ans;
void upd(int x){ans=add(ans,x);}
int calc(int m1,int m2,int kd){
if(kd==OR) return m1||m2;
if(kd==AND) return m1&&m2;
return W[K[m1]]<W[K[m2]];
}
int qpow(int x,int sq){
int res=1;
for(;sq;x=mul(x,x),sq>>=1) if(sq&1) res=mul(res,x);
return res;
}
void getans(int num){
for(int i=1;i<=tot;W[i]=i,i++);
do{
top=0;
for(int i=1;i<=n;i++){
if(p[i]>0) S[++top]=p[i];
else --top,S[top]=calc(S[top],S[top+1],p[i]);
} if(S[top]) upd(num); --top;
}while(next_permutation(W+1,W+tot+1));
}
void fd(int x){
if(x==8){getans(C[tot]);return;}
for(int i=1;i<=tot;i++){K[x]=i;fd(x+1);}
K[x]=++tot,fd(x+1),tot--;
}
int main(){
for(int ch=getchar();ch!='\n';ch=getchar()){
if(ch==' ') continue;
if(islower(ch)) p[++n]=ch-'a'+1; if(ch=='(') S[++top]=9;
if(ch==')'){while(S[top--]!=9) p[++n]=S[top+1];}
if(ch=='<'){while(S[top]<=LESS) p[++n]=S[top--];S[++top]=LESS;}
if(ch=='&'){while(S[top]<=AND) p[++n]=S[top--];S[++top]=AND;}
if(ch=='|'){while(S[top]<=OR) p[++n]=S[top--];S[++top]=OR;}
} while(top) p[++n]=S[top--]; m=read(),C[0]=1;
for(int i=1;i<=n;i++){
if(p[i]>0) putchar('a'-1+p[i]);
else if(p[i]==LESS) putchar('<');
else if(p[i]==OR) putchar('|');
else if(p[i]==AND) putchar('&');
else puts("SJK_AK_IOI");
putchar(i<n?' ':'\n');
}
for(int i=1;i<=7;i++) C[i]=mul(C[i-1],mul(qpow(i,mod-2),m-i+1));
fd(1),printf("%d\n",ans);return 0;
}

表达式(exp)的更多相关文章

  1. Restrictions.like("字段field","%表达式exp%");

    Restrictions.like("字段field","%表达式exp%");用hql语句就是 from table where field like '%e ...

  2. C++_系列自学课程_第_10_课_表达式_《C++ Primer 第四版》

    程序设计语言中大部分程序都在进行表达式的求值操作, 例如求两个数的和,求一个表达式的逻辑结果,或者通过输入输出表达式语句进行输入和输出. 这里我们对表达式进行讨论. 一.表达式 1.表达式 表达式由一 ...

  3. codevs2574 波兰表达式

    题目描述 Description 对于 加.减.乘.除这种四则运算的表达式,我们使用的是先乘除.后加减的从左到右的顺序进行运算,如果要指定特定的顺序,就要增加括号进行表达,比如 (A+B)*C , A ...

  4. javascript正则表达式中 (?=exp)、(?<=exp)、(?!exp)

     (?=exp) 百度百科给的解释:非获取匹配,正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用.例如,“Windows(?=95|98|NT|2000) ...

  5. 7 -- Spring的基本用法 -- 12... Spring 3.0 提供的表达式语言(SpEL)

    7.12 Spring 3.0 提供的表达式语言(SpEL) Spring表达式语言(简称SpEL)是一种与JSP 2 的EL功能类似的表达式语言,它可以在运行时查询和操作对象图.支持方法调用和基本字 ...

  6. Linux-正则表达式学习(精)

    正则表达式30分钟入门教程 来园子之前写的一篇正则表达式教程,部分翻译自codeproject的The 30 Minute Regex Tutorial. 由于评论里有过长的URL,所以本页排版比较混 ...

  7. Scala基础篇-04 try表达式

    1.try表达式 定义 try{} catch{} finally{} //例子 try{ Integer.parseInt("dog") }catch { }finally { ...

  8. 正则表达式和文本挖掘(Text Mining)

    在进行文本挖掘时,TSQL中的通配符(Wildchar)显得功能不足,这时,使用“CLR+正则表达式”是非常不错的选择,正则表达式看似非常复杂,但,万变不离其宗,熟练掌握正则表达式的元数据,就能熟练和 ...

  9. shell中各种括号的作用()、(())、[]、[[]]、{}

    一.小括号,圆括号() 1.单小括号 ()    ①命令组.括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用.括号中多个命令之间用分号隔开,最后一个命令可以没有 ...

随机推荐

  1. php修改密码

      为了让页面更为好看一些,我一般会选择bootstrap,写起来虽然看着麻烦,但是我们真正需要的只有中间的内容  下面是html的内容 <div id="tbx"" ...

  2. Apache禁止ip访问

    网站突然让禁止ip访问,于是就通过配置Apache达到了想要的效果. 我们网站用的是Apache+tomcat集群,所以需要配置虚拟主机,虚拟主机我在这里就不说了,不明白的上网搜搜吧,这里只说禁止ip ...

  3. 论JavaWeb前后端分离放弃jsp

    1.静态资源使用Nginx反向代理Tomcat,Tomcat挂了网站仍可访问.2.静态与后端服务器分离,提升性能.3.大并发情况下,可同时扩展前后端服务器.4.接口可复用至App相关服务.5.网站热部 ...

  4. openCV图像形态学

    #include <cv.h> #include <highgui.h> #include <stdio.h> //平滑处理 int main() { IplIma ...

  5. 忘记apple id如何更新应用?

    最近ytkah的app有很多更新提示,之前注册的apple id好久没登录了,突然提示说登录需要验证安全问题,哪还记得噢,最要命的是邮箱收到的加密邮件也需要验证.重新注册一个吧,这次要注意保存相关信息 ...

  6. Struts详解

    1.什么是MVC? MVC是Model,View,Controller的缩写,MVC是Application开发的设计模式, 也就是大家所知道的Model2.在MVC的设计模式中,它包括三类对象:(1 ...

  7. 每天一个Linux命令(15)tail命令

    tail命令用于输入文件中的尾部内容.tail命令默认在屏幕上显示指定文件的末尾10行. 如果给定的文件不止一个,则在显示的每个文件前面加一个文件名标题.     (1)用法: 用法:   tail ...

  8. leetcode 1049 Last Stone Weight II(最后一块石头的重量 II)

    有一堆石头,每块石头的重量都是正整数. 每一回合,从中选出任意两块石头,然后将它们一起粉碎.假设石头的重量分别为 x 和 y,且 x <= y.那么粉碎的可能结果如下: 如果 x == y,那么 ...

  9. 【leetcode刷题笔记】Valid Number

    Validate if a given string is numeric. Some examples:"0" => true" 0.1 " => ...

  10. 【leetcode刷题笔记】Subsets

    Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset must be ...