HUST 1599 Multiple
首先,1000000能被64整除。
也就是说Y=X*1000000+P,当P能被64整除(P在1--6位之间),X任意的时候,Y也能被64整除。因此暴力算一下1--6位的数字中哪些能被64整除,再看看这些数组成Y形式的有几种。
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; char s[300000 + 10]; long long tot[300000 + 10]; long long ans; int size; int main() { while (~scanf("%s", s)){ ans = 0; memset(tot, 0, sizeof tot); size = strlen(s); for (int i = 0; s[i]; i++) { if (s[i] == '0') tot[i] = tot[i - 1]; else tot[i] = tot[i - 1] + 1; } for (int len = 1; len <= 6; len++) { for (int i = 0; s[i]; i++) { if (s[i] == '0'&&len != 1) continue; if (i + len - 1 >= size) continue; int num = 0; for (int j = i; j <= i + len - 1; j++) num = num * 10 + s[j] - '0'; if (num % 64 == 0) { ans++; bool fail = 0; if (i + len - 6 <= 0) fail = 1; for (int j = i - 1; j >= i + len - 6; j--) if (s[j] != '0') fail = 1; if (fail == 0) ans = ans + tot[i + len - 7]; } } } printf("%lld\n", ans); } return 0; }