void ft_dec(t_elem *tmpa, char **str, int *cpt_null) { (void)cpt_null; *str = mod_dec(tmpa); if (ft_atoi(*str) == 0 && SPREC.pt == 1) { ft_strdel(str); *str = ft_strdup(""); ft_positive(tmpa, str); } else if ((*str)[0] == '-') ft_negative(tmpa, str); else ft_positive(tmpa, str); }
int expression() { if(*ptr != '(') { int cID; if(*ptr == '?') cID = maxn << 1; else if(*ptr >= 'A' && *ptr <= 'D') cID = *ptr - 'A'; else cID = maxn + *ptr - 'a'; ++ptr; return cID; } ++ptr; // '(' int LID = expression(); ++ptr; // ')' char op = *(ptr++); ++ptr; // '(' int RID = expression(); ++ptr; // ')' int cID = qtot++; if(op == '&' || op == '?') // and { memcpy(x.way, que[LID].way, maxm * sizeof(int)); for(int i = 0; i < maxd; ++i) for(int j = maxm - 1; j >= 0; --j) if(j & (1 << i)) mod_inc(x.way[j ^ (1 << i)], x.way[j]); memcpy(y.way, que[RID].way, maxm * sizeof(int)); for(int i = 0; i < maxd; ++i) for(int j = maxm - 1; j >= 0; --j) if(j & (1 << i)) mod_inc(y.way[j ^ (1 << i)], y.way[j]); for(int i = 0; i < maxm; ++i) z.way[i] = (LL)x.way[i] * y.way[i] % mod; for(int i = 0; i < maxd; ++i) for(int j = maxm - 1; j >= 0; --j) if(j & (1 << i)) mod_dec(z.way[j ^ (1 << i)], z.way[j]); for(int i = 0; i < maxm; ++i) mod_inc(que[cID].way[i], z.way[i]); } if(op == '|' || op == '?') // or { memcpy(x.way, que[LID].way, maxm * sizeof(int)); for(int i = 0; i < maxd; ++i) for(int j = 0; j < maxm; ++j) if(j & (1 << i)) mod_inc(x.way[j], x.way[j ^ (1 << i)]); memcpy(y.way, que[RID].way, maxm * sizeof(int)); for(int i = 0; i < maxd; ++i) for(int j = 0; j < maxm; ++j) if(j & (1 << i)) mod_inc(y.way[j], y.way[j ^ (1 << i)]); for(int i = 0; i < maxm; ++i) z.way[i] = (LL)x.way[i] * y.way[i] % mod; for(int i = 0; i < maxd; ++i) for(int j = 0; j < maxm; ++j) if(j & (1 << i)) mod_dec(z.way[j], z.way[j ^ (1 << i)]); for(int i = 0; i < maxm; ++i) mod_inc(que[cID].way[i], z.way[i]); } return cID; }