hdu 4192(表达式求值)

题意:给一个表达式当中有一些变量,然后告诉你一些数字你可以任意排列,问能不能求出要求的结果。

思路:由于变量数目较小所以直接全排列枚举即可,然后用栈处理表达式。

代码如下:

 1 /**************************************************
 2  * Author     : xiaohao Z
 3  * Blog     : http://www.cnblogs.com/shu-xiaohao/
 4  * Last modified : 2014-06-28 21:50
 5  * Filename     : hdu_4192.cpp
 6  * Description     : 
 7  * ************************************************/
 8 
 9 #include <iostream>
10 #include <cstdio>
11 #include <cstring>
12 #include <cstdlib>
13 #include <cmath>
14 #include <algorithm>
15 #include <queue>
16 #include <stack>
17 #include <vector>
18 #include <set>
19 #include <map>
20 #define MP(a, b) make_pair(a, b)
21 #define PB(a) push_back(a)
22 
23 using namespace std;
24 typedef long long ll;
25 typedef pair<int, int> pii;
26 typedef pair<unsigned int,unsigned int> puu;
27 typedef pair<int, double> pid;
28 typedef pair<ll, int> pli;
29 typedef pair<int, ll> pil;
30 
31 const int INF = 0x3f3f3f3f;
32 const double eps = 1E-6;
33 const int LEN = 10100;
34 int n, res, a, num[LEN], len;
35 char str[LEN];
36 map<char, int> mp;
37 
38 struct P{
39     int x;
40     char c;
41     P(){}
42     P(int _x){x = _x;}
43     P(char _c){c = _c;}
44 };
45 
46 int top;
47 int ch(char c){
48     if(!mp.count(c)) mp[c] = top++;
49     return mp[c];
50 }
51 
52 bool calc(){
53     stack<P> s;
54     for(int i=0; i<len; i++){
55         if(str[i] == '(') continue;
56         else if(str[i] == '+' || str[i] == '-' || str[i] == '*'){
57             s.push(P(str[i]));
58         }else if(str[i] >= 'a' && str[i] <= 'z'){
59             s.push(P(num[ch(str[i])]));
60         }else if(str[i] == ')'){
61             P a = s.top();s.pop();
62             P op = s.top();s.pop();
63             P b = s.top();s.pop();
64             switch(op.c){
65                 case '+': b.x+=a.x;break;
66                 case '-': b.x-=a.x;break;
67                 case '*': b.x*=a.x;break;
68             }
69             s.push(b);
70         }
71     }
72     return s.top().x == res;
73 }
74 
75 bool solve(){
76     sort(num, num + n);
77     do{
78         if(calc()) return true;
79     }while(next_permutation(num, num + n));
80     return false;
81 }
82 
83 int main()
84 {
85 //    freopen("in.txt", "r", stdin);
86 
87     while(scanf("%d", &n)!=EOF){
88         mp.clear();top = 0;
89         for(int i=0; i<n; i++)
90             scanf("%d", &num[i]);
91         scanf("%d", &res);
92         if(!n && !res) break;
93         scanf("%s", &str);
94         len = strlen(str);
95         if(solve()) puts("YES");
96         else puts("NO");
97     }
98     return 0;
99 }
View Code

 

转载于:https://www.cnblogs.com/shu-xiaohao/p/3813968.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于 HDU4992 所有原根的问题,我可以给出以下解答: 1. 首先,我们需要知道什么是原根。原根是指模 n 意义下,所有与 n 互质的数 a 的最小正整数 k 次幂对 n 取模的覆盖了所有与 n 互质的数。简单来说,就是如果一个数 a 是模 n 意义下的原根,那么 a 的任何正整数次幂对 n 取模的都不相同,且能覆盖所有与 n 互质的数。 2. 为了模 n 意义下的所有原根,我们需要先出与 n 互质的数的个数 phi(n)。phi(n) 可以使用欧拉函数出。 3. 然后,我们需要枚举模 n 意义下的所有数,判断它是否是原根。具体来说,对于每个 a,我们需要判断 a 的每个小于 phi(n) 的正整数次幂对 n 取模的是否都不相同,且能覆盖所有与 n 互质的数。如果是,那么 a 就是模 n 意义下的原根。 4. 代码实现可以参考以下 Java 代码: ``` import java.util.*; public class Main { static int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); } static int phi(int n) { int res = n; for (int i = 2; i * i <= n; i++) { if (n % i == 0) { res = res / i * (i - 1); while (n % i == 0) { n /= i; } } } if (n > 1) { res = res / n * (n - 1); } return res; } static int pow(int a, int b, int mod) { int res = 1; while (b > 0) { if ((b & 1) != 0) { res = res * a % mod; } a = a * a % mod; b >>= 1; } return res; } static boolean check(int a, int n, int phi) { for (int i = 1, j = pow(a, i, n); i <= phi; i++, j = j * a % n) { if (j == 1) { return false; } } return true; } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { int n = scanner.nextInt(); int phi = phi(n); List<Integer> ans = new ArrayList<>(); for (int i = 1; i < n; i++) { if (gcd(i, n) == 1 && check(i, n, phi)) { ans.add(i); } } Collections.sort(ans); for (int x : ans) { System.out.print(x + " "); } System.out.println(); } } } ``` 其中,gcd 函数用于最大公约数,phi 函数用于欧拉函数,pow 函数用于快速幂模,check 函数用于判断一个数是否是原根。在主函数中,我们依次读入每个 n,出 phi(n),然后枚举模 n 意义下的所有数,判断它是否是原根,将所有原根存入一个 List 中,最后排序输出即可。 希望我的回答能够帮到你,如果你有任何问题,欢迎随时提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值