木有做出来,发现是在求组合数模的时候求错了。
今后涉及取模运算除法的应该把其逆求出来,而不应该直接拿出来除之后再去求逆。
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; }