codeforces_330c

来源:互联网 发布:美国数据挖掘前景 编辑:程序博客网 时间:2024/05/22 13:20

木有做出来,发现是在求组合数模的时候求错了。

今后涉及取模运算除法的应该把其逆求出来,而不应该直接拿出来除之后再去求逆。

AC代码:

#include <cstdio>#include <string.h>#include <iostream>using namespace std;const int MAX_NUMBER = 1000007;const long long MOD_NUMBER =  1000000007; long long value[MAX_NUMBER];bool isGood[MAX_NUMBER * 9];int a,b;int length;int check(int number) {    while (number) {        int temp = number % 10;        if (temp != a && temp != b) {            return 0;        }        number /= 10;    }    return 1;}long long getMod(long long number, long long power) {    long long result = 1;    long long square = number;    while (power) {        if (power & 1) {            result = (result * square) % MOD_NUMBER;        }        square = (square * square) % MOD_NUMBER;        power >>= 1;    }    return result;}int main() {    scanf("%d%d%d", &a, &b, &length);    if (a < b) {        int temp = a;        a = b;        b = temp;    }    for (int s = 1; s <= length * a; s++) {        if (check(s)) {            isGood[s] = 1;        }    }    value[0] = 1;    for (long long i = 0; i < length; i++) {        long long inverse = getMod(i + 1, MOD_NUMBER - 2);        value[i + 1] = (value[i] * (length - i)) % MOD_NUMBER;        value[i + 1] = (value[i + 1] * inverse) % MOD_NUMBER;    }    long long ans = 0;    for (int s = 1; s <= length * a; s++) {        if (isGood[s]) {            int temp = s - length * b;            if (temp >= 0 && (temp % (a - b)) == 0) {                int x = temp / (a - b);                ans = (ans + value[x]) % MOD_NUMBER;            }        }    }    cout << ans << endl;}

原创粉丝点击