(O2)
#include <bits/stdc++.h>
using namespace std;
map<string, long long>f1;
map<string, pair<bool, bool> >f2;
long long string_to_int(string num) {
if (f1[num] != 0) {
return f1[num];
}
if (num == "") {
return 0;
}
if (num.length() == 1) {
f1[num] = num[0] - '0';
return f1[num];
}
f1[num] = string_to_int(num.substr(1, num.length() - 1)) + (num[0] - '0') * 10;
return f1[num];
}
int main() {
string s;
long long cnt = 0, p;
cin >> p;
cin >> s;
for (int i = 0; i < s.length(); i++) {
for (int j = 0; j < s.length() - i; j++) {
if(f2[s.substr(i, j)].first&&f2[s.substr(i,j)].second){
cnt++;
continue;
}
if (i + j < s.length() && string_to_int(s.substr(i, j)) % p == 0) {
f2[s.substr(i, j)] = {true, true};
cnt++;
} else {
f2[s.substr(i, j)] = {true, false};
}
}
}
cout << cnt;
return 0;
}
求助~~~
最开始:暴力枚举 后来:暴力枚举+记忆化
求助~~~
(发布者:一名小学五年级学生)