#include <bits/stdc++.h>
using namespace std;
int dp[1000005][2];
inline int carry(int ak, int bk, int ck, int c)
{
int sum=ak+bk+c;
if(sum%10==ck)
{
return sum/10;
}
return -1;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
string sa,sb,sc;
cin>>sa>>sb>>sc;
int n=sa.length();
vector<int> a(n);
vector<int> b(n);
vector<int> c(n);
for(int i=0; i<n; i++)
{
a[i]=sa[i]-'0';
b[i]=sb[i]-'0';
c[i]=sc[i]-'0';
}
for(int k=0; k<n; k++)
{
for(int co=0; co<=1; co++)
{
int current=(co==0 ? 1 : 0);
int chain=0;
if(k>0)
{
int next=carry(a[k-1],b[k-1],c[k-1],co);
if(next!=-1)
{
chain=dp[k-1][next];
}
}
dp[k][co]=current+chain;
}
}
long long total=0;
for(int j=0; j<n; j++)
{
int initial=carry(a[j],b[j],c[j],0);
if(initial!=-1)
{
total+=dp[j][initial];
}
}
cout<<total<<endl;
return 0;
}
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 | #include <bits/stdc++.h> using namespace std; int dp[1000005][2]; inline int carry(int ak, int bk, int ck, int c) { int sum=ak+bk+c; if(sum%10==ck) { return sum/10; } return -1; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); string sa,sb,sc; cin>>sa>>sb>>sc; int n=sa.length(); vector<int> a(n); vector<int> b(n); vector<int> c(n); for(int i=0; i<n; i++) { a[i]=sa[i]-'0'; b[i]=sb[i]-'0'; c[i]=sc[i]-'0'; } for(int k=0; k<n; k++) { for(int co=0; co<=1; co++) { int current=(co==0 ? 1 : 0); int chain=0; if(k>0) { int next=carry(a[k-1],b[k-1],c[k-1],co); if(next!=-1) { chain=dp[k-1][next]; } } dp[k][co]=current+chain; } } long long total=0; for(int j=0; j<n; j++) { int initial=carry(a[j],b[j],c[j],0); if(initial!=-1) { total+=dp[j][initial]; } } cout<<total<<endl; return 0; } |
English