Submission #1072636
Source Code Expand
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll MOD = 1000000007; int main(){ string a,b,c; while(cin >> a,a!="0"){ cin >> b >> c; ll n=a.size()-1; ll i,j,k; ll ans[85][2]={{}}; ans[n+1][0]=1; for(i=n;i>0;i--){ if(a[i]!='?'){ if(b[i]!='?'){ if(c[i]!='?'){ if(a[i]+b[i]-'0'==c[i]) ans[i][0]=ans[i+1][0]; if(a[i]+b[i]-'0'==c[i]-1) ans[i][0]=ans[i+1][1]; if(a[i]+b[i]-'0'==c[i]+10) ans[i][1]=ans[i+1][0]; if(a[i]+b[i]-'0'==c[i]+10-1) ans[i][1]=ans[i+1][1]; }else{ if(a[i]-'0'+b[i]-'0'<10) ans[i][0]+=ans[i+1][0]; else ans[i][1]+=ans[i+1][0]; if(a[i]-'0'+b[i]-'0'+1<10) ans[i][0]+=ans[i+1][1]; else ans[i][1]+=ans[i+1][1]; } }else{ if(c[i]!='?'){ if(a[i]==c[i]){ ans[i][0]+=ans[i+1][0]; ans[i][1]+=ans[i+1][1]; }else if(a[i]<c[i]){ ans[i][0]+=ans[i+1][0]+ans[i+1][1]; }else{ ans[i][1]+=ans[i+1][0]+ans[i+1][1]; } }else{ k=a[i]-'0'; ans[i][0]+=ans[i+1][1]*(10-(k+1)); ans[i][1]+=ans[i+1][1]*(k+1); ans[i][0]+=ans[i+1][0]*(10-k); ans[i][1]+=ans[i+1][0]*k; } } }else{ if(b[i]!='?'){ if(c[i]!='?'){ if(b[i]==c[i]){ ans[i][0]+=ans[i+1][0]; ans[i][1]+=ans[i+1][1]; }else if(b[i]<c[i]){ ans[i][0]+=ans[i+1][0]+ans[i+1][1]; }else{ ans[i][1]+=ans[i+1][0]+ans[i+1][1]; } }else{ k=b[i]-'0'; ans[i][0]+=ans[i+1][1]*(10-(k+1)); ans[i][1]+=ans[i+1][1]*(k+1); ans[i][0]+=ans[i+1][0]*(10-k); ans[i][1]+=ans[i+1][0]*k; } }else{ if(c[i]!='?'){ k=c[i]-'0'; ans[i][0]+=ans[i+1][0]*(k+1); ans[i][1]+=ans[i+1][0]*(10-(k+1)); ans[i][0]+=ans[i+1][1]*k; ans[i][1]+=ans[i+1][1]*(10-k); }else{ ans[i][0]+=ans[i+1][0]*55+ans[i+1][1]*45; ans[i][1]+=ans[i+1][0]*45+ans[i+1][1]*55; } } } ans[i][0]%=MOD; ans[i][1]%=MOD; //cout << ans[i][0] << ":" << ans[i][1] << endl; } i=0; if(a[i]!='0'&&b[i]!='0'&&c[i]!='0'){ if(a[i]!='?'){ if(b[i]!='?'){ if(c[i]!='?'){ if(a[i]+b[i]-'0'==c[i]) ans[i][0]=ans[i+1][0]; if(a[i]+b[i]-'0'==c[i]-1) ans[i][0]=ans[i+1][1]; }else{ if(a[i]-'0'+b[i]-'0'<10) ans[i][0]+=ans[i+1][0]; if(a[i]-'0'+b[i]-'0'+1<10) ans[i][0]+=ans[i+1][1]; } }else{ if(c[i]!='?'){ if(a[i]<c[i])ans[i][0]+=ans[i+1][0]; if(a[i]+1<c[i])ans[i][0]+=ans[i+1][1]; }else{ k=a[i]-'0'; if(0<(10-(k+1))) ans[i][0]+=ans[i+1][0]*(10-(k+1)); if(0<(10-(k+2))) ans[i][0]+=ans[i+1][1]*(10-(k+2)); } } }else{ if(b[i]!='?'){ if(c[i]!='?'){ if(b[i]<c[i])ans[i][0]+=ans[i+1][0]; if(b[i]+1<c[i])ans[i][0]+=ans[i+1][1]; }else{ k=b[i]-'0'; if(0<(10-(k+1))) ans[i][0]+=ans[i+1][0]*(10-(k+1)); if(0<(10-(k+2))) ans[i][0]+=ans[i+1][1]*(10-(k+2)); } }else{ if(c[i]!='?'){ k=c[i]-'0'; if(0<k-1) ans[i][0]+=ans[i+1][0]*(k-1); if(0<k-2) ans[i][0]+=ans[i+1][1]*(k-2); }else{ ans[i][0]+=ans[i+1][0]*36+ans[i+1][1]*28; } } } } //cout << ans[i][0] << ":" << ans[i][1] << endl; cout << ans[0][0]%MOD << endl; } return 0; }
Submission Info
Submission Time | |
---|---|
Task | B - Restore Calculation |
User | beet |
Language | C++ (GCC 4.4.7) |
Score | 100 |
Code Size | 3319 Byte |
Status | AC |
Exec Time | 20 ms |
Memory | 796 KB |
Judge Result
Set Name | all | ||
---|---|---|---|
Score / Max Score | 100 / 100 | ||
Status |
|
Set Name | Test Cases |
---|---|
all | Merged |
Case Name | Status | Exec Time | Memory |
---|---|---|---|
Merged | AC | 20 ms | 796 KB |