ACM 训练日志记录 · 思考 · 成长 提交 / 修改记录
王梓豪 / 题目列表训练档案
导出

P1037 产生数

来源:洛谷 ★ 1300

本题活力0.26按难度、完成结果与训练证据估算

算法如山行则将至

题目描述

对整数n应用k个变换规则,求可生成的不同整数个数。

代码

#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;
}