Submission #1350355

#TimeUsernameProblemLanguageResultExecution timeMemory
1350355vjudge1Slon (COCI15_slon)C++20
0 / 120
7 ms2416 KiB
#include <bits/stdc++.h>

using namespace std;

#define all(v) v.begin(), v.end()
#define int long long

const int M = 1e5 + 1;

int pre[M+1], n, mod;
vector<int> ind[M];
string s;

pair<int,int> mul(pair<int,int> a, pair<int,int> b)
{
	pair<int,int> ans;
	ans.first=a.first*b.second+a.second*b.first, ans.second=a.second*b.second;
	return ans;
}

void fix(pair<int,int> &p)
{
	p.first%=mod, p.second%=mod;
	p.first+=mod, p.second+=mod;
	p.first%=mod, p.second%=mod;
}

pair<int,int> solve(int l,int r)
{
	vector<pair<int,int>> ad;
	pair<int,int> cur={0,1};
	pair<int,int> ans={0,0};
	for (int i=l;i<r;i++)
	{
		if (s[i]=='+')
			ans.first+=cur.first, ans.second+=cur.second, cur={0,1};
		else if(s[i]=='-')
			ans.first-=cur.first, ans.second-=cur.second, cur={0,1};
		else if(s[i]=='(')
		{
			int x=upper_bound(all(ind[pre[i]]), i)-begin(ind[pre[i]]);
			cur=mul(cur,solve(i+1,ind[pre[i]][x]-1));
			i=ind[pre[i]][x]-1;
		}
		else if(s[i]=='x')
			cur=mul(cur,{1,0});
		else if('0'<=s[i] && s[i]<='9')
		{
			int val=0;
			for (;i<r;i++)
			{
				if (s[i]<'0' or s[i]>'9') break;
				val=val*10+(s[i]-'0');
			}
			i--;
			cur=mul(cur,{0,val});
		}
		fix(cur), fix(ans);
	}
	ans.first+=cur.first, ans.second+=cur.second;
	fix(ans);
	return ans;
}

signed main()
{
	cin>>s;
	n=s.size();
	int p;
	cin>>p>>mod;
	ind[0].push_back(0);
	for (int i=0;i<n;i++)
	{
		pre[i+1]=pre[i];
		if (s[i]=='(') pre[i+1]++;
		if (s[i]==')') pre[i+1]--;
		ind[pre[i+1]].push_back(i+1);
	}
	pair<int,int> ex=solve(0,n);
	for (int i=0;i<mod;i++)
		if (((ex.first*i+ex.second)%mod+mod)%mod==p)
		{
			cout<<i<<endl;
			break;
		}

	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...