Initial commit: C++ courseware
This commit is contained in:
commit
4a4ee7c287
1789 files changed
+373489
No files matched your search
@@ -0,0 +1,28 @@
|
||||
// P1037 产生数。十个数字的自反传递闭包 + 十进制高精度乘法。
|
||||
#include <bits/stdc++.h>
|
||||
using namespace std;
|
||||
string mulSmall(string s, int k) {
|
||||
int carry = 0;
|
||||
for (int i = (int)s.size()-1; i >= 0; --i) {
|
||||
int t = (s[i]-'0')*k + carry;
|
||||
s[i] = char('0'+t%10); carry = t/10;
|
||||
}
|
||||
while (carry) { s.insert(s.begin(), char('0'+carry%10)); carry /= 10; }
|
||||
return s;
|
||||
}
|
||||
int main() {
|
||||
ios::sync_with_stdio(false); cin.tie(nullptr);
|
||||
string number; int k; if (!(cin >> number >> k)) return 0;
|
||||
bool reach[10][10] = {};
|
||||
for (int i = 0; i < 10; ++i) reach[i][i] = true;
|
||||
for (int i = 0, a, b; i < k; ++i) { cin >> a >> b; reach[a][b] = true; }
|
||||
for (int mid = 0; mid < 10; ++mid)
|
||||
for (int i = 0; i < 10; ++i)
|
||||
for (int j = 0; j < 10; ++j)
|
||||
reach[i][j] |= reach[i][mid] && reach[mid][j];
|
||||
int choices[10] = {};
|
||||
for (int a = 0; a < 10; ++a) for (int b = 0; b < 10; ++b) choices[a] += reach[a][b];
|
||||
string ans = "1";
|
||||
for (char digit : number) ans = mulSmall(ans, choices[digit-'0']);
|
||||
cout << ans << '\n';
|
||||
}
|
||||
Reference in new issue
Block a user