1. 程式人生 > >刪數字(組合)

刪數字(組合)

刪數字

時間限制: 1 Sec  記憶體限制: 128 MB

題目描述

奶牛在數學課上學習了整除的概念。農夫Farmer John為了考驗它的數學水平,於是在白紙上寫了正整數T。由於農夫不喜歡數字0,所以正整數T是不含數字0的。奶牛可以刪除T的若干位數字,剩下來的數字從左到右構成一個正整數P,使得正整數P必須是5的倍數。奶牛有多少種不同的刪除方案?具體請看樣例解釋。

 

輸入

第一行,一個正整數T。

 

輸出

一個整數,奶牛不同的刪除方案數。
1、奶牛可以刪除0個數字(即不刪除任何數字)。
2、奶牛不能把T全部刪除掉。即至少要剩下1位數字。
3、由於T的位數可能較長,建議用字串形式讀入。
 

 

樣例輸入

複製樣例資料

1256

樣例輸出

4

 

提示

奶牛有4種不同的刪除方案:
第1種方案:刪除T的第四位數字,剩下的P=125,是5的倍數。
第2種方案:刪除T的第一位和第四位數字,剩下的P=25,是5的倍數。
第3種方案:刪除T的第二位和第四位數字,剩下的P=15,是5的倍數。
第4種方案:刪除T的第一位、第二位、第四位數字,剩下的P=5,是5的倍數。

連個範圍都沒有,我還以為要大數呢

只要從後面往前找5的每個位置,然後看5前面有多少位數,因為5後面都要刪除,5前面可以選0個,1個.....

/**/
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <stack>
#include <queue>

typedef long long LL;
using namespace std;

char s[1005];
LL f[65];

int main()
{
	//freopen("in.txt", "r", stdin);
	//freopen("out.txt", "w", stdout);

	f[0] = 1;
	for (int i = 1; i <= 62; i++) f[i] = f[i - 1] * 2;
	scanf("%s", s);
	int len = strlen(s);
	LL ans = 0;
	for (int i = len - 1; i >= 0; i--){
		if(s[i] == '5'){
			ans += f[i];
		}
	}
	printf("%lld\n", ans);

	return 0;
}
/**/