• Codeforces Round #265 (Div. 2) E


    这题说的是给了数字的字符串 然后有n种的操作没次将一个数字替换成另一个字符串,求出最后形成的字符串的 数字是多大,我们可以逆向的将每个数推出来,计算出他的值和位数记住位数用10的k次方来记 1位就是10 2位就是100,这样是为了防止当位数很大的时候存不下这样可以直接的进行mod操作

    #include <iostream>
    #include <cstdio>
    #include <string.h>
    #include <cmath>
    #include <string>
    #include <vector>
    using namespace std;
    typedef long long ll;
    const int max_n=100005;
    const ll mod= 1000000007;
    struct point{
       ll val,loc;
    }digit[9];
    char str[max_n];
    vector<int> F[max_n];
    char S[max_n];
    int n;
    int main()
    {
         while(scanf("%s",str)==1){
           for(int i=0; i<10; ++i)
                digit[i].loc=10,digit[i].val=i;
          scanf("%d",&n);
            for(int i=0; i<n; i++){
                F[i].clear();
               scanf("%s",S);
               F[i].push_back(S[0]-'0');
               int len=strlen(S);
               for(int j=3; j<len; ++j)
                F[i].push_back(S[j]-'0');
            }
            for(int i =n-1; i>=0; --i )
            {
                ll val=0,loc=1;
                int L =F[i].size();
                for(int k=L-1; k>0; --k){
                    int t =F[i][k];
                    val=(val+loc*digit[t].val)%mod;
                    loc=(loc*digit[t].loc)%mod;
                }
                digit[F[i][0]].loc=loc;
                digit[F[i][0]].val=val;
            }
            ll ans=0,loc=1;
            int L =strlen(str);
            for(int i=L-1; i>=0; --i){
                  ll t= str[i]-'0';
                  ans=(ans+digit[t].val*loc)%mod;
                  loc=(loc*digit[t].loc)%mod;
            }
            printf("%I64d
    ",ans);
         }
        return 0;
    }
    View Code
  • 相关阅读:
    ElasticSearch搜索
    Muddery框架
    https和http的区别
    multiprocessing模块创建进程
    进程理论基础
    单例模式
    原型模式
    建造者模式
    StrutsTypeConverter的使用
    UML用例图之泛化(generalization)、扩展(extend)和包含(include)关系--UML一波流系列讲解
  • 原文地址:https://www.cnblogs.com/Opaser/p/3977173.html
Copyright © 2020-2023  润新知