| Task: | Laskutoimitus |
| Sender: | Laakeri |
| Submission time: | 2025-12-20 17:33:37 +0200 |
| Language: | C++ (C++11) |
| Status: | READY |
| Result: | 10 |
| group | verdict | score |
|---|---|---|
| #1 | RUNTIME ERROR | 0 |
| #2 | RUNTIME ERROR | 0 |
| #3 | ACCEPTED | 10 |
| #4 | RUNTIME ERROR | 0 |
| #5 | RUNTIME ERROR | 0 |
| #6 | RUNTIME ERROR | 0 |
| test | verdict | time | group | |
|---|---|---|---|---|
| #1 | RUNTIME ERROR | 0.01 s | 1, 2, 6 | details |
| #2 | WRONG ANSWER | 0.01 s | 1, 2, 6 | details |
| #3 | ACCEPTED | 0.02 s | 1, 2, 3, 4, 5, 6 | details |
| #4 | RUNTIME ERROR | 0.01 s | 2, 6 | details |
| #5 | WRONG ANSWER | 0.01 s | 2, 6 | details |
| #6 | ACCEPTED | 0.01 s | 2, 3, 4, 5, 6 | details |
| #7 | RUNTIME ERROR | 0.02 s | 6 | details |
| #8 | WRONG ANSWER | 0.09 s | 6 | details |
| #9 | ACCEPTED | 0.08 s | 3, 4, 5, 6 | details |
| #10 | RUNTIME ERROR | 0.02 s | 4, 6 | details |
| #11 | RUNTIME ERROR | 0.02 s | 4, 6 | details |
| #12 | RUNTIME ERROR | 0.03 s | 5, 6 | details |
| #13 | WRONG ANSWER | 0.09 s | 5, 6 | details |
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]);
pfs *= vw;
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<<"aa "<<prefixes(ss[i])*pfs<<endl;
// inside this
ans += solvein2(ss[i]);
ans%=mod;
//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;
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: RUNTIME ERROR
| input |
|---|
| *3*7*5+67*2*7*12+38*4+9+2+1+45... |
| correct output |
|---|
| 665527462 |
| user output |
|---|
| (empty) |
Error:
code: input/code.cpp:29: ll sumfreewhole(const std::string&): Assertion `s[0]!='*'' failed.
Test 2
Group: 1, 2, 6
Verdict: WRONG ANSWER
| input |
|---|
| 84149523195388144+1*8*5*1722+5... |
| correct output |
|---|
| 572374284 |
| user output |
|---|
| 81426030 |
Feedback: Incorrect character on line 1 col 1: expected "572374284", got "81426030"
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: RUNTIME ERROR
| input |
|---|
| +4976829*6+5+9*21+4*889+6*7+4*... |
| correct output |
|---|
| 503712700 |
| user output |
|---|
| (empty) |
Error:
code: input/code.cpp:226: int main(): Assertion `cur.size()>0' failed.
Test 5
Group: 2, 6
Verdict: WRONG ANSWER
| input |
|---|
| 862+83782+493135426+3152859674... |
| correct output |
|---|
| 624304680 |
| user output |
|---|
| 995132254 |
Feedback: Incorrect character on line 1 col 1: expected "624304680", got "995132254"
Test 6
Group: 2, 3, 4, 5, 6
Verdict: ACCEPTED
| input |
|---|
| 297736662651354417265929591745... |
| correct output |
|---|
| 625284593 |
| user output |
|---|
| 625284593 |
Test 7
Group: 6
Verdict: RUNTIME ERROR
| input |
|---|
| +9+1+8+92*761+68*983*1+7*1+1*2... |
| correct output |
|---|
| 947469815 |
| user output |
|---|
| (empty) |
Error:
code: input/code.cpp:226: int main(): Assertion `cur.size()>0' failed.
Test 8
Group: 6
Verdict: WRONG ANSWER
| input |
|---|
| 97831833*7+4229897789494398634... |
| correct output |
|---|
| 173934151 |
| user output |
|---|
| 363525590 |
Feedback: Incorrect character on line 1 col 1: expected "173934151", got "363525590"
Test 9
Group: 3, 4, 5, 6
Verdict: ACCEPTED
| input |
|---|
| 777551563653223263644973172313... |
| correct output |
|---|
| 278364064 |
| user output |
|---|
| 278364064 |
Test 10
Group: 4, 6
Verdict: RUNTIME ERROR
| input |
|---|
| +481+4+66+2+26+7+5+97+6+4+3+14... |
| correct output |
|---|
| 244847224 |
| user output |
|---|
| (empty) |
Error:
code: input/code.cpp:226: int main(): Assertion `cur.size()>0' failed.
Test 11
Group: 4, 6
Verdict: RUNTIME ERROR
| input |
|---|
| +8858717+53+6927+314+742552843... |
| correct output |
|---|
| 928369840 |
| user output |
|---|
| (empty) |
Error:
code: input/code.cpp:226: int main(): Assertion `cur.size()>0' failed.
Test 12
Group: 5, 6
Verdict: RUNTIME ERROR
| input |
|---|
| *7*75*59*7*9*74*4*18211*31*1*7... |
| correct output |
|---|
| 219382651 |
| user output |
|---|
| (empty) |
Error:
code: input/code.cpp:29: ll sumfreewhole(const std::string&): Assertion `s[0]!='*'' failed.
Test 13
Group: 5, 6
Verdict: WRONG ANSWER
| input |
|---|
| 73171*3438*9*34165158853*375*7... |
| correct output |
|---|
| 451362612 |
| user output |
|---|
| 58232131 |
Feedback: Incorrect character on line 1 col 1: expected "451362612", got "58232131"
