Codeforces 464C Substitutes in Number(高效+快速幂)

题目链接:Codeforces 464C Substitutes in Number

题目大意:给定一个字符串,以及n中变换操作,将一个数字变成一个字符串,可能为空串,然后最后将字符串当成一

个数,取模1e9+7。

解题思路:将操作倒过来处理,这样维护每个数来的val,len两个,val表示对应数值取模1e9+7,len表示对应有多少

位,再计算的过程中要使用。

#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>

using namespace std;
typedef long long ll;
const int maxn = 1e5+5;
const ll mod = 1e9+7;

char s[maxn], o[maxn];
int n;
ll v[20], l[20];

ll pow_mod (ll x, int n) {
    ll ret = 1;
    while (n) {
        if(n&1)
            ret = ret * x % mod;
        x = x * x % mod;
        n >>= 1;
    }
    return ret;
}

struct state {
    int r;
    vector<int> vec;

    void set (char* str) {
        int len = strlen(str);
        r = str[0] - ‘0‘;
        vec.clear();
        for (int i = 3; i < len; i++) {
            if (str[i] >= ‘0‘ && str[i] <= ‘9‘)
                vec.push_back(str[i] - ‘0‘);
        }
    }

    void solve () {
        ll val = 0, len = 0;

        for (int i = 0; i < vec.size(); i++) {
            int u = vec[i];

            len += l[u];
            val = (val * pow_mod(10, l[u]) + v[u]) % mod;
            len %= (mod-1);
        }
        v[r] = val;
        l[r] = len;
    }
}com[maxn];

void init () {
    for (int i = 0; i < 10; i++) {
        v[i] = i;
        l[i] = 1;
    }

    for (int i = 0; i < n; i++) {
        scanf("%s", o);
        com[i].set(o);
    }

    for (int i = n - 1; i >= 0; i--) {
        int u = com[i].r;
        com[i].solve();
    }
}

int main () {
    scanf("%s%d", s, &n);
    init();

    int len = strlen(s);
    ll ans = 0;
    for (int i = 0; i < len; i++) {
        int u = s[i] - ‘0‘;
        ans = (ans * pow_mod(10, l[u]) + v[u]) % mod;
    }
    printf("%lld\n", ans);
    return 0;
}
时间: 2024-08-05 17:04:24

Codeforces 464C Substitutes in Number(高效+快速幂)的相关文章

Codeforces 464C Substitutes in Number 同余定理+模拟

题目链接:点击打开链接 题意: 给定一串数字 下面有n个操作 每行格式形如 d->t d为一位数字,t为任意长度的数字. t的长度和不超过100000 问:最后的结果%1e9+7 思路: 首先我们可以得到一个结论: 同余定理使用后不能再修改数字. 那么为了让同余定理能够使用,我们倒序处理每个数字,这样就能保证能够使用同余定理. 记录每个数字实际代表的数字和实际对应的位数. 然后倒序处理上来即可. #include <stdio.h> #include <string.h> #

Number Sequence(快速幂矩阵)

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1005 Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 131753    Accepted Submission(s): 31988 Problem Description A number sequence

codeforces 678D Iterated Linear Function 矩阵快速幂

矩阵快速幂的题要多做 由题可得 g[n]=A*g[n-1]+B 所以构造矩阵  { g[n] }    =  {A   B}  * { g[n-1]} {   1   }         {0   1}     {    1    } 然后矩阵快速幂就好 矩阵快速幂的题要多做,多构造矩阵 注:其实这个题可以直接等比数列求求和,单数矩阵快速幂对于这类题更具有普遍性 #include <cstdio> #include <iostream> #include <ctime>

Codeforces 450B - Jzzhu and Sequences ( 矩阵快速幂 )

题意: 给定f1和f2,求fn 分析: 特判f1,f2 当n>=3时使用矩阵快速幂即可( 简单题 ) 将公式转化一下 , 可以得到一个变换矩阵 代码: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define CLR( a, b ) memset( a, b, sizeof(a) ) #define MAT_SIZE 2 #define MOD 10

Prime Number(CodeForces-359C)[快速幂/思维]

题意:已知X,数组arr[n],求一个分式的分子与分母的最大公因数.分子为ΣX^arr[i],分母为X^Σarr[i],数组为不递减序列. 思路:比赛的时候以为想出了正确思路,WA掉了很多发,看了别人写的代码才发现自己漏掉很多细节. 1.容易想到,分子的最低次幂即可能为所需答案 2.由于arr里存在相同的数,因此分子的各个幂存在可以合并同类项的情况,所以应该先彻底完成合并同类项,再进行步骤1. 3.一个小技巧,并不需要完成所有项的合并,当且仅当当前最小项的系数可以被X整除时才需要继续合并,否则当

HDU 6198 number number number 矩阵快速幂 找规律

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6198 题目描述: 给你一个k, 你可以用K个斐波那契数列中的数来构造一个数, 现在我们要求构造不出来的那个最小的数字 解题思路: 首先我们把斐波那契数列写出来, 0, 1, 1, 2, 3, 5, 8, 13, 21, 43 . . . . . . , 我们首先发现当K == 1 的时候构造不出来的数显然是4, 然后2个的时候是12, 三个是33, 然后找规律就是 f(2*n+3)-1 .....

ZOJ - 3690 Choosing number 矩阵快速幂

题目大意:有n个人排成一行,有m个数字,每个人可以选择1 – m的任一个数字,但有一个限制,如果相邻的两个人选择相同的数字的话,这个数字必须大于k 问有多少种选择方法 解题思路:变化矩阵为(m-k, k, m - k, k - 1),按行的写 设前一个数为j 如果j大于k的话,那么j后面可以跟上任一个数 如果j小于等于k,那么j后面只能跟上不等于k的数 如果有p种情况为前一个数大于k的,q种情况为前一个数小于等于k的,由上面可得,当前这个数大于k的情况有 p * (n -k) + q * (n

【矩阵快速幂 】Codeforces 450B - Jzzhu and Sequences (公式转化)

[题目链接]click here~~ [题目大意] Jzzhu has invented a kind of sequences, they meet the following property: You are given x and y, please calculate fn modulo1000000007(109?+?7). [解题思路] /*A - Jzzhu and Sequences Codeforces 450B - Jzzhu and Sequences ( 矩阵快速幂 )

CodeForces 185A. Plant(矩阵快速幂)

题目链接:http://codeforces.com/problemset/problem/185/A Dwarfs have planted a very interesting plant, which is a triangle directed "upwards". This plant has an amusing feature. After one year a triangle plant directed "upwards" divides int