题目链接
Vitaly 是一个非常奇怪的人。他有两个偏爱的数字 a 和 b 。如果一个正整数的十进制表示,仅包含数字 a 和 b,则 Vitaly 将这个正整数称之为 good 。如果某个 good 数 A 的各位数字之和也是一个 good 数,那么 Vitaly 就把这个 good 数 A 称之为 excellent 。
例如,假定 Vitaly 的偏爱数字是 1 和 3,那么数 12 不是 good,而数 13 或 311 却是。另外,数 111 是 excellent,数 11 却不是。
现在,Vitaly 想要知道,有多少个长度恰好是 n 的 excellent 数。由于这个数目可能很大,他请您在计数时,对 1000000007 (109 + 7) 取模即可。
一个数的长度是指,它的十进制表示,有多少位数字 (不含前导的零)。
输入
第一行包含了三个整数: a, b, n (1 ≤ a < b ≤ 9, 1 ≤ n ≤ 106)。
输出
打印单个整数 — 问题的答案对 1000000007 (109 + 7) 取模。
示例
输入
1 3 3
输出
1
输入
2 3 10
输出
165
思路:枚举一下i的个数,如果a*i+(n-i)*b也是个excellent数的话,答案就是C(n,i)。
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
typedef long long ll;
const int mod=1e9+7;
ll f[maxn],ans;
ll quick(ll a,ll b)
{
ll ans=1;
a=a%mod;
while(b!=0)
{
if(b&1) ans=(ans*a)%mod;
b>>=1;
a=(a*a)%mod;
}
return ans;
}
ll C(int n,int m)
{
if(n<m) return 0;
return f[n]*quick(f[m],mod-2)%mod*quick(f[n-m],mod-2)%mod;
}
bool check(int n,int a,int b)
{
while(n>0)
{
if(n%10!=a&&n%10!=b) return 0;
n/=10;
}
return 1;
}
int main()
{
int n,a,b;
scanf("%d%d%d",&a,&b,&n);
f[0]=1;
for(int i=1;i<=n;++i) f[i]=(f[i-1]*i)%mod;
for(int i=0;i<=n;++i)
if(check(i*a+(n-i)*b,a,b)) ans=(ans+C(n,i))%mod;
printf("%lld\n",ans);
}