算法如山行则将至
题目描述
对整数n应用k个变换规则,求可生成的不同整数个数。
思考与重做
王梓豪的同题记录 · 1 条
- 王梓豪 · 2026-08-16本次记录最后更新 2026.8.17
完成结果:未记录
本题题解为floyd算法,但是我直接用dfs做了,会爆longlong,但是可以用__int128。
代码
#include <bits/stdc++.h>
using namespace std;
int b[10] = {0};
void print(__int128 num)
{
if (num < 0)
{
putchar('-');
num = -num;
}
if (num > 9)
print(num / 10);
putchar(num % 10 + '0');
}
void bfs(int n, vector<pair<int,int>>& v)
{
queue<int> q;
int vis[10] = {0};
int cnt = 1;
vis[n] = 1;
q.push(n);
while (!q.empty())
{
int temp = q.front();
q.pop();
for (int i = 0; i < v.size(); i++)
{
if (v[i].first == temp && !vis[v[i].second])
{
vis[v[i].second] = 1;
cnt++;
q.push(v[i].second);
}
}
}
b[n] = cnt;
}
int main()
{
string a;
int k;
cin >> a >> k;
vector<pair<int,int> > v(k);
for (int i = 0; i < k; i++)
{
cin >> v[i].first >> v[i].second;
}
for (int i = 0; i < 10; i++)
{
bfs(i, v);
}
__int128 ans = 1;
for (int i = 0; i < a.size(); i++)
{
ans *= b[a[i] - '0'];
}
print(ans);
return 0;
}