Dreaming
时间限制(普通/Java) : 1000 MS/ 3000 MS 运行内存限制 : 65536 KByte
总提交 : 96 测试通过 : 13
总提交 : 96 测试通过 : 13
比赛描述
我们定义一个数good当且仅当它只由a和b构成,且数位和sum各数位也仅由a和b构成。举个栗子:若a=1,b=2,那么13不是good,11是(都由a=1构成,数位和sum=2由b=2构成)。那么窝们定义一个数的长度为n,那么有多少个数是good呢?所求答案对10^9+7取模。
输入
多组样例。
每行包含三个数a,b,n(1<=a,b<=9,1<=n<=10^6)
输出
每组数据输出一个整数。
样例输入
1 3 3
样例输出
1
题目来源
NUPT
/* Internet AC
#include <cstdio>
#define ll long long
int const MAX = 1e6 + 2;
int const MOD = 1e9 + 7;
ll fac[MAX];
int n, a, b;
void pre()
{
fac[0] = fac[1] = 1;
for(int i = 2; i <= MAX; i++)
fac[i] = (fac[i - 1] * i) % MOD;
}
bool judge(int x)
{
while(x)
{
if(x % 10 != a && x % 10 != b)
return false;
x /= 10;
}
return true;
}
ll inv(ll x)
{
ll res = 1, y = MOD - 2;
while(y)
{
if(y & 1)
res = (res * x) % MOD;
x = (x * x) % MOD;
y >>= 1;
}
return res;
}
ll C(int n, int m)
{
return fac[n] * inv(fac[m]) % MOD * inv(fac[n - m]) % MOD;
}
int main()
{
pre();
while(scanf("%d %d %d", &a, &b, &n) != EOF)
{
int ans = 0;
for(int i = 0; i <= n; i++)
{
int sum = a * i + b * (n - i);
if((sum % 10 != a) && (sum % 10 != b))
continue;
else if(judge(sum / 10))
ans = (ans % MOD + C(n, i) % MOD) % MOD;
}
printf("%d\n", ans);
}
}
*/
#include <cstdio>
#define ll long long
int const MAX = 1e6 + 2;
int const MOD = 1e9 + 7;
ll fac[MAX];
int n, a, b;
void pre()
{
fac[0] = fac[1] = 1;
for(int i = 2; i < MAX; i++)
fac[i] = (fac[i - 1] * i) % MOD;
}
bool judge(int x)
{
while(x)
{
if(x % 10 != a && x % 10 != b)
return false;
x /= 10;
}
return true;
}
//模逆元?
ll inv(ll x)
{
ll res = 1, y = MOD - 2; //减2什么意思?
while(y)
{
if(y & 1)
res = (res * x) % MOD;
x = (x * x) % MOD;
y >>= 1;
}
return res;
}
ll C(int n, int m)
{
return fac[n] * inv(fac[m]) % MOD * inv(fac[n - m]) % MOD;
}
int main()
{
pre();
while(scanf("%d %d %d", &a, &b, &n) != EOF)
{
int ans = 0;
for(int i = 0; i <= n; i++)
{
int sum = a * i + b * (n - i); //数字由i个a和(n-i)个b组成
if( judge(sum) )
ans = ( ans + C(n, i) ) % MOD;
}
printf("%d\n", ans);
}
}