Example #1
0
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);
}
Example #2
0
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;
}