#include <iostream>
#include <string>
using namespace std;
int czy[1000002];
int a[1000002];
int b[1000002];
int c[1000002];
int carry[1000002];
int main()
{
string as,bs,cs;
cin>>as>>bs>>cs;
int n=as.size();
//cout<<(a[0]-48+b[0]-48)%10;
for(int i=0;i<n;++i){
a[i]=as[i]-48;
b[i]=bs[i]-48;
c[i]=cs[i]-48;
if(a[i]+b[i]==c[i])czy[i]=1;
}
for(int i=n-1;i>0;--i){
int sum=a[i]+b[i];
if(sum>9&&sum%10==c[i]&&(a[i-1]+b[i-1])%10+1==c[i-1]){
int pocz=i;
bool poprawne=false;
while(i>0){
--i;
sum=a[i]+b[i];
if(sum>9&&sum%10+1==c[i]&&(a[i-1]+b[i-1])%10+1==c[i-1])continue;
else if(a[i]+b[i]+1==c[i]){
poprawne=true;
break;
}
else break;
}
if(poprawne||(i==0&&a[0]+b[0]+1==c[0])){
for(int j=pocz;j>=i;--j)czy[j]=2;
}
}
}
// for(int i=0;i<n;++i)cout<<czy[i];
//cout<<endl;
for(int i=0;i<n;++i){
a[i]=as[i]-48;
b[i]=bs[i]-48;
c[i]=cs[i]-48;
if(a[i]+b[i]==c[i])czy[i]=1;
}
long long int wyn=0;
bool dwa_przed=false;
for(int i=n-1;i>=0;--i){
long long int ile=0;
bool dwa=false;
// int curr=czy[i];
while(1){
if(czy[i]==1){
++ile;
}
else if(czy[i]==2){
dwa=true;
while(czy[i]==2)--i;
++i;
break;
}
else break;
--i;
}
if(dwa_przed){
wyn+=ile;
dwa_przed=false;
}
if(dwa){
wyn+=ile+1;
dwa_przed=true;
}
wyn+=(ile*(ile+1))/2;
// cout<<"i="<<i<<' '<<ile<<endl;
}
cout<<wyn;
return 0;
}
/*
095212067321
287333076123
382545143444
*/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | #include <iostream> #include <string> using namespace std; int czy[1000002]; int a[1000002]; int b[1000002]; int c[1000002]; int carry[1000002]; int main() { string as,bs,cs; cin>>as>>bs>>cs; int n=as.size(); //cout<<(a[0]-48+b[0]-48)%10; for(int i=0;i<n;++i){ a[i]=as[i]-48; b[i]=bs[i]-48; c[i]=cs[i]-48; if(a[i]+b[i]==c[i])czy[i]=1; } for(int i=n-1;i>0;--i){ int sum=a[i]+b[i]; if(sum>9&&sum%10==c[i]&&(a[i-1]+b[i-1])%10+1==c[i-1]){ int pocz=i; bool poprawne=false; while(i>0){ --i; sum=a[i]+b[i]; if(sum>9&&sum%10+1==c[i]&&(a[i-1]+b[i-1])%10+1==c[i-1])continue; else if(a[i]+b[i]+1==c[i]){ poprawne=true; break; } else break; } if(poprawne||(i==0&&a[0]+b[0]+1==c[0])){ for(int j=pocz;j>=i;--j)czy[j]=2; } } } // for(int i=0;i<n;++i)cout<<czy[i]; //cout<<endl; for(int i=0;i<n;++i){ a[i]=as[i]-48; b[i]=bs[i]-48; c[i]=cs[i]-48; if(a[i]+b[i]==c[i])czy[i]=1; } long long int wyn=0; bool dwa_przed=false; for(int i=n-1;i>=0;--i){ long long int ile=0; bool dwa=false; // int curr=czy[i]; while(1){ if(czy[i]==1){ ++ile; } else if(czy[i]==2){ dwa=true; while(czy[i]==2)--i; ++i; break; } else break; --i; } if(dwa_przed){ wyn+=ile; dwa_przed=false; } if(dwa){ wyn+=ile+1; dwa_przed=true; } wyn+=(ile*(ile+1))/2; // cout<<"i="<<i<<' '<<ile<<endl; } cout<<wyn; return 0; } /* 095212067321 287333076123 382545143444 */ |
English