P1037 产生数

题目描述

给出一个整数 n(n<10^{30})n(n<1030) 和 kk 个变换规则 (k \le 15)(k15) 。

规则:

一位数可变换成另一个一位数:

规则的右部不能为零。

例如: n=234n=234 。有规则( k=2k=2 ):

22 -> 55
33 -> 66
上面的整数 234234 经过变换后可能产生出的整数为(包括原数):

234234
534534
264264
564564
共 44 种不同的产生数

问题:

给出一个整数 nn 和 kk 个规则。

求出:

经过任意次的变换( 00 次或多次),能产生出多少个不同整数。

仅要求输出个数。

输入输出格式

输入格式:

键盘输入,格式为:

n knk
x_1 y_1x1y1
x_2 y_2x2y2
... ...

x_n y_nxnyn

输出格式:

屏幕输出,格式为:

11 个整数(满足条件的个数):

输入输出样例

输入样例#1:  复制
234 2
2 5
3 6
输出样例#1:  复制
4





#include

using namespace std;

char q[100] ;
int ans[100];
int temp[10];
int book[10];
vectortu[10];

void dfs(int node)
{
    temp[node] = 1;
    for(int i = 0 ; i < tu[node].size(); i ++)
    {
        //temp[tu[node][i]] = 1;
        if( temp[tu[node][i]] == 0 )

            dfs(tu[node][i]);
    }
}
int main()
{
    int n ;
    cin >> q >> n;
    for(int i = 1; i <= n ; i ++)
    {
        int a , b;
        cin >> a >> b;
        tu[a].push_back(b);
    }
    for(int i = 0 ; i <= 9 ;i ++)
    {
        memset(temp , 0, sizeof(temp));
        dfs(i);
        int sum = 0;
        for(int j = 0 ; j <= 9 ; j ++)
            if(temp[j] == 1)
                sum ++;
        book[i] = sum;
    }
    /*
    for(int i = 0 ; i <= 9 ; i ++)
        cout << book[i] << " ";
    cout << endl;
    */
    ans[0] = 1;
    int num = 0;
    //cout << strlen(q) << endl;
    for(int i = 0 ; i < strlen(q) ; i ++)
    {
        num ++ ;
        int sum = book[q[i] - '0'];
        //cout << sum << endl;
        int x = 0;
        for(int j = 0 ; j < 100 ; j ++)
        {
            ans[j] = ans[j] * sum + x;
            x = ans[j] / 10;
            ans[j] %= 10;
        }
        /*for(int j = 4 ; j >= 0 ; j --)
            cout << ans[j];
        cout << endl;
        */
    }
   // cout << num << endl;;
    int endd = 99;
    while(!ans[endd] && endd > 0)
        endd --;
    for(int i = endd ; i >= 0 ; i --)
        cout << ans[i];
    return 0;
}

你可能感兴趣的:(数据结构)