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;
}
posted @ 2021-07-25 19:09  acmloser  阅读(18)  评论(0编辑  收藏  举报