CF -- Phone Number
Time Limit: 2000MS | Memory Limit: 262144KB | 64bit IO Format: %I64d & %I64u |
Description
Alas, finding one's true love is not easy. Masha has been unsuccessful in that yet. Her friend Dasha told Masha about a way to determine the phone number of one's Prince Charming through arithmancy.
The phone number is divined like that. First one needs to write down one's own phone numbers. For example, let's suppose that Masha's phone number is12345. After that one should write her favorite digit from 0 to 9 under the first digit of her number. That will be the first digit of the needed number. For example, Masha's favorite digit is 9. The second digit is determined as a half sum of the second digit of Masha's number and the already written down first digit from her beloved one's number. In this case the arithmetic average equals to (2 + 9) / 2 = 5.5. Masha can round the number up or down, depending on her wishes. For example, she chooses the digit 5. Having written down the resulting digit under the second digit of her number, Masha moves to finding the third digit in the same way, i.e. finding the half sum the the third digit of her number and the second digit of the new number. The result is (5 + 3) / 2 = 4. In this case the answer is unique. Thus, every i-th digit is determined as an arithmetic average of the i-th digit of Masha's number and the i - 1-th digit of her true love's number. If needed, the digit can be rounded up or down. For example, Masha can get:
Input
The first line contains nonempty sequence consisting of digits from 0 to 9 — Masha's phone number. The sequence length does not exceed 50.
Output
Output the single number — the number of phone numbers Masha will dial.
Sample Input
12345
48
09
15
#include<cstdio> #include<iostream> #include<cstring> #include<cmath> using namespace std ; long long dp[52][10] ; int map[54]; char s[52] ; int main() { int n , mun , i , j; //freopen("in.txt","r",stdin) ; //freopen("oo.txt","w",stdout) ; while( scanf("%s",s) != EOF ) { n = strlen(s) ; map[0] = s[0]-'0' ; for( i = 1 ; i < n ;i++ ) { map[i] = s[i]-'0' ; } memset(dp,0,sizeof(dp)) ; for( i = 0 ; i <= 9 ;i++ ){ dp[0][i] = 1 ; } for( j = 1 ; j < n ;j++ ) { for( i = 0 ; i <= 9 ;i++ ) { if(i*2-1-map[j]>=0 &&i*2-1-map[j] <= 9)dp[j][i] += dp[j-1][i*2-1-map[j]] ; if(i*2-map[j]>=0 &&i*2-map[j]<=9 )dp[j][i] += dp[j-1][i*2-map[j]] ; if(i*2+1-map[j]<=9 &&i*2+1-map[j] >=0 )dp[j][i] += dp[j-1][i*2+1-map[j]] ; } } long long ans = 0 ; for( i = 0 ; i <= 9 ;i++ ) ans += dp[n-1][i] ; int *a = map ; bool flag = 1 ; int pre = a[0] ; for(int i=1; i< n; i++){ int t = pre + a[i] ; if(t % 2 == 1){ if(t / 2 != a[i] && t / 2 + 1 != a[i]) flag = 0 ; }else{ if(t / 2 != a[i]) flag = 0 ; } pre = a[i] ; } if(flag){ ans-- ; } cout << ans << endl ; } return 0 ; }