Beautiful Numbers CodeForces - 300C
原题链接
考察:组合数学
错误思路:
DFS枚举
正确思路:
直接枚举长度是\(10^6\)的数是不可能的.但是注意到和很小,最多是\(9*10^6\).假设\(x\)个\(a\),则有\(n-x\)个\(b\),如果当前和合法,那么就是两个数添位置的简单组合数学
Code
#include <iostream>
#include <cstring>
using namespace std;
const int M = 1000000007,N = 1e6+10;
typedef long long LL;
int a,b,n,fact[N],infact[N];
bool check(int sum)
{
while(sum)
{
if(sum%10!=a&&sum%10!=b) return 0;
sum/=10;
}
return 1;
}
int qsm(int a,int k,int m)
{
int res = 1;
while(k)
{
if(k&1) res = (LL)a*res%m;
a = (LL)a*a%m;
k>>=1;
}
return res;
}
void init()
{
fact[0] = 1,infact[0] = 1;
for(int i=1;i<=n;i++)
{
fact[i] = (LL)fact[i-1]*i%M;
infact[i] = (LL)infact[i-1]*qsm(i,M-2,M)%M;
}
int res = 0;
for(int i=0;i<=n;i++)
{
int sum = i*a+(n-i)*b;//是否只含a,b
if(!check(sum)) continue;
res = res+(LL)fact[n]*infact[i]%M*infact[n-i]%M;
res%=M;
}
printf("%d\n",res);
}
int main()
{
scanf("%d%d%d",&a,&b,&n);
init();
return 0;
}