Submission details
Task:Laskutoimitus
Sender:Laakeri
Submission time:2025-12-20 18:51:41 +0200
Language:C++ (C++11)
Status:READY
Result:100
Feedback
groupverdictscore
#1ACCEPTED5
#2ACCEPTED25
#3ACCEPTED10
#4ACCEPTED10
#5ACCEPTED10
#6ACCEPTED40
Test results
testverdicttimegroup
#1ACCEPTED0.01 s1, 2, 6details
#2ACCEPTED0.01 s1, 2, 6details
#3ACCEPTED0.01 s1, 2, 3, 4, 5, 6details
#4ACCEPTED0.02 s2, 6details
#5ACCEPTED0.02 s2, 6details
#6ACCEPTED0.01 s2, 3, 4, 5, 6details
#7ACCEPTED0.11 s6details
#8ACCEPTED0.09 s6details
#9ACCEPTED0.08 s3, 4, 5, 6details
#10ACCEPTED0.10 s4, 6details
#11ACCEPTED0.08 s4, 6details
#12ACCEPTED0.13 s5, 6details
#13ACCEPTED0.10 s5, 6details

Compiler report

input/code.cpp: In function 'll solvein(const std::string&)':
input/code.cpp:174:20: warning: unused variable 'vw' [-Wunused-variable]
  174 |                 ll vw = sumfreewhole(ss[i]);
      |                    ^~

Code

#include <bits/stdc++.h>
#define F first
#define S second
#define X real()
#define Y imag()
using namespace std;
typedef long double ld;
typedef long long ll;

const ll mod=1e9+7;

ll pot(ll x, ll p) {
	if (p==0) return 1;
	if (p%2==0) {
		x=pot(x, p/2);
		return (x*x)%mod;
	}
	return (x*pot(x, p-1))%mod;
}
ll inv(ll x) {
	return pot(x, mod-2);
}

ll sumfreewhole(const string& s){
	ll prod=1;
	ll cn=0;
	int cnl=0;
	ll sum=0;
	assert(s[0]!='*');
	assert(s.back()!='*');
	for (int i=0;i<(int)s.size();i++){
		assert(s[i]!='+');
		if (s[i]=='*'){
			assert(cnl);
			prod*=cn;
			prod%=mod;
			cn=0;
			cnl=0;
		} else {
			ll t=s[i]-'0';
			assert(t>=1&&t<=9);
			cnl++;
			cn*=10ll;
			cn+=t;
			cn%=mod;
			sum+=prod*cn;
			sum%=mod;
		}
	}
	return (prod*cn)%mod;
}


ll prefixes(const string& s){
	ll prod=1;
	ll cn=0;
	int cnl=0;
	ll sum=0;
	assert(s[0]!='*');
	assert(s.back()!='*');
	for (int i=0;i<(int)s.size();i++){
		assert(s[i]!='+');
		if (s[i]=='*'){
			assert(cnl);
			prod*=cn;
			prod%=mod;
			cn=0;
			cnl=0;
		} else {
			ll t=s[i]-'0';
			assert(t>=1&&t<=9);
			cnl++;
			cn*=10ll;
			cn+=t;
			cn%=mod;
			sum+=prod*cn;
			sum%=mod;
		}
	}
	return sum;
}

ll suffixes(const string& s){
	ll prod=1;
	ll cn=0;
	int cnl=0;
	ll cnp=1;
	ll sum=0;
	assert(s[0]!='*');
	assert(s.back()!='*');
	for (int i=(int)s.size()-1;i>=0;i--){
		assert(s[i]!='+');
		if (s[i]=='*'){
			assert(cnl);
			prod*=cn;
			prod%=mod;
			cn=0;
			cnl=0;
			cnp=1;
		} else {
			ll t=s[i]-'0';
			assert(t>=1&&t<=9);
			cnl++;
			cn+=cnp*t;
			cn%=mod;
			cnp*=10ll;
			cnp%=mod;
			sum+=prod*cn;
			sum%=mod;
		}
	}
	return sum;
}

ll tps[1010101];


ll solvein2(const string& s){
	ll pfs=0;
	int n=(int)s.size();
	ll ans=0;
	for (int i=0;i<n;i++){
		//cout<<"pf "<<pfs<<endl;

		assert(s[i]!='*');
		assert(s[i]!='+');
		ll t=s[i]-'0';
		assert(t>=1&&t<=9);
		ans+=(pfs*10ll)%mod;
		ans%=mod;

		ans+=t*((ll)i+1ll);
		ans%=mod;

		pfs*=10ll;
		pfs+=t*(ll)(i+1);
		pfs%=mod;
	}
	return ans;
}

ll solvein(const string& s){
	int ps=0;
	int n=(int)s.size();
	for (int i=0;i<n;i++){
		assert(s[i]!='+');
		if (s[i]=='*'){
			ps++;
		}
	}
	ll ans=0;
	string cur;

	vector<string> ss;

	for (int i=0;i<=n;i++){
		if (i==n||s[i]=='*'){
			ss.push_back(cur);
			cur="";
		} else {
			cur+=s[i];
		}
	}

	vector<ll> sufprod((int)ss.size()+1);
	sufprod[0]=1;
	for (int i=0;i<(int)ss.size();i++){
		sufprod[i+1]=(sufprod[i]*sumfreewhole(ss[i]))%mod;
	}


	ll pfs=0;
	for (int i=0;i<(int)ss.size();i++){
		ll vw = sumfreewhole(ss[i]);

		if (i>0){
			pfs *= sumfreewhole(ss[i-1]);
			pfs%=mod;
		}

		if (i>0){
			pfs+=suffixes(ss[i-1]);
			pfs%=mod;
		}

		// include prefix of this (including the whole) and non-zero before
		ans += prefixes(ss[i])*pfs;
		ans%=mod;

		//cout<<ans<<endl;

		//cout<<vw<<" "<<pfs<<" "<<prefixes(ss[i])<<endl;

		//cout<<"aa "<<prefixes(ss[i])*pfs<<endl;

		// inside this
		ans += solvein2(ss[i]);
		ans%=mod;

		//cout<<ans<<endl;

		//cout<<"bb "<<solvein2(ss[i])<<endl;
	}
	return ans;
}



int main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0);

	tps[0]=1;
	for (ll i=1;i<=1000000;i++){
		tps[i]=tps[i-1]*10ll;
		tps[i]%=mod;
	}

	string s;
	cin>>s;

	if (s.back()=='*' || s.back()=='+'){
		s.pop_back();
	}
	if (s.size()==0){
		cout<<0<<endl;
		return 0;
	}
	if (s[0]=='*' || s[0]=='+'){
		s=s.substr(1);
	}
	if (s.size()==0){
		cout<<0<<endl;
		return 0;
	}

	int ps=0;
	int n=(int)s.size();
	for (int i=0;i<n;i++){
		if (s[i]=='+' || s[i]=='*'){
			ps++;
		}
	}
	ll ans=0;
	string cur;
	int sps=0;
	int spp=0;
	for (int i=0;i<=n;i++){
		if (i==n || s[i]=='+'){
			assert(cur.size()>0);

			ll wv=sumfreewhole(cur);
			ll pc=i-(int)cur.size()+1-sps;
			ll sc=n-i-ps+sps+spp+1;

			ll sfs=suffixes(cur);
			ll pfs=prefixes(cur);

			//cout<<cur<<endl;
			//cout<<wv<<" "<<pc<<" "<<sc<<endl;
			//cout<<sfs<<" "<<pfs<<endl;

			// choose this and non-zero stuff before and after
			ans+=(((pc-1ll+mod)*(sc-1ll+mod))%mod)*wv;
			ans%=mod;

			//cout<<"a "<<ans<<endl;

			// choose suffix of this and non-zero stuff from after
			ans+=(sfs*(sc-1ll+mod))%mod;
			ans%=mod;

			//cout<<"b "<<ans<<endl;

			// choose prefix of this and non-zero stuff before
			ans+=(pfs*(pc-1ll+mod))%mod;
			ans%=mod;

			//cout<<"c "<<ans<<endl;

			// choose inside this, including the full thing
			ans+=solvein(cur);
			ans%=mod;

			//cout<<"d "<<solvein(cur)<<endl;

			sps++;
			sps+=spp;
			spp=0;
			cur="";
		} else {
			cur+=s[i];
			if (s[i]=='*'){
				spp++;
			}
		}
	}
	cout<<ans<<endl;
}

Test details

Test 1

Group: 1, 2, 6

Verdict: ACCEPTED

input
*3*7*5+67*2*7*12+38*4+9+2+1+45...

correct output
665527462

user output
665527462

Test 2

Group: 1, 2, 6

Verdict: ACCEPTED

input
84149523195388144+1*8*5*1722+5...

correct output
572374284

user output
572374284

Test 3

Group: 1, 2, 3, 4, 5, 6

Verdict: ACCEPTED

input
347358248955243114242997746491...

correct output
823495931

user output
823495931

Test 4

Group: 2, 6

Verdict: ACCEPTED

input
+4976829*6+5+9*21+4*889+6*7+4*...

correct output
503712700

user output
503712700

Test 5

Group: 2, 6

Verdict: ACCEPTED

input
862+83782+493135426+3152859674...

correct output
624304680

user output
624304680

Test 6

Group: 2, 3, 4, 5, 6

Verdict: ACCEPTED

input
297736662651354417265929591745...

correct output
625284593

user output
625284593

Test 7

Group: 6

Verdict: ACCEPTED

input
+9+1+8+92*761+68*983*1+7*1+1*2...

correct output
947469815

user output
947469815

Test 8

Group: 6

Verdict: ACCEPTED

input
97831833*7+4229897789494398634...

correct output
173934151

user output
173934151

Test 9

Group: 3, 4, 5, 6

Verdict: ACCEPTED

input
777551563653223263644973172313...

correct output
278364064

user output
278364064

Test 10

Group: 4, 6

Verdict: ACCEPTED

input
+481+4+66+2+26+7+5+97+6+4+3+14...

correct output
244847224

user output
244847224

Test 11

Group: 4, 6

Verdict: ACCEPTED

input
+8858717+53+6927+314+742552843...

correct output
928369840

user output
928369840

Test 12

Group: 5, 6

Verdict: ACCEPTED

input
*7*75*59*7*9*74*4*18211*31*1*7...

correct output
219382651

user output
219382651

Test 13

Group: 5, 6

Verdict: ACCEPTED

input
73171*3438*9*34165158853*375*7...

correct output
451362612

user output
451362612