思路还是相当地巧妙。
求余数的话,(a+b)%n=(a%n+b%n)%n;
用vector来表示整数的话(出现1的位置),可以避免溢出。
注意第20行,在更新remainders[(j+r)%n]时,要确保每个remainders的每个序列都是递增的,不能存在相等的情况。
1 #include2 #include 3 #include 4 5 using namespace std; 6 7 long long findMInZeroOneNum(int n) { 8 vector > remainders(n); 9 remainders[1].push_back(0);10 11 bool update = false;12 int noupdate = 0;13 for (int i = 1, j = 10 % n; ; j = (j * 10) % n, i++) {14 if (remainders[j].empty()) {15 remainders[j].push_back(i);16 update = true;17 }18 for (int r = 1; r < n; ++r) {19 if (remainders[r].empty()) continue;20 if (i <= remainders[r].back()) continue;21 if (!remainders[(j + r) % n].empty()) continue;22 remainders[(j + r) % n] = remainders[r];23 remainders[(j + r) % n].push_back(i);24 update = true;25 }26 if (!update) noupdate++;27 else noupdate = 0;28 if (noupdate == n || !remainders[0].empty()) break;29 }30 31 if (remainders[0].empty()) return -1;32 else {33 long long ans = 0;34 for (int i = 0; i < remainders[0].size(); ++i) {35 ans += pow(10, remainders[0][i]);36 }37 return ans;38 }39 }40 41 long long bruteForce(int n) {42 if (n <= 0) return -1;43 for (long long i = 1; ; ++i) {44 if (i % n != 0) continue;45 long long tmp = i;46 while (tmp) {47 int d = tmp % 10; 48 if (d != 0 && d != 1) break;49 tmp /= 10;50 }51 if (tmp == 0) return i;52 }53 return -1;54 }55 56 int main() {57 srand(time(NULL));58 int n = rand() % 99;59 60 cout << n << endl;61 long long n1 = findMInZeroOneNum(n);62 cout << n1 << endl;63 long long n2 = bruteForce(n);64 cout << n2 << endl;65 if (n1 != n2) {66 cout << n << " " << n1 << " " << n2 << endl;67 }68 69 return 0;70 }