题目:Beautiful Numbers
题目链接:https://vjudge.net/contest/351853#problem/D
题目描述:在由k位由a,b组成的数(美丽数)当中,找到各位相加后依然由a,b组成的数,输出这样的数个数。
题目分析:先枚举所以美丽数各位相加的结果,检查其是否为美丽数,如果是,算出其a,b组合的方式数。
代码:
#include <stdio.h>
#include <stdlib.h>
int a,b,k;
long long n,m=1000000007;
long long c[1000010];
int cheak(int x) //检查是否为美丽数
{
while(x)
{
if(x%10!=a&&x%10!=b) return 0;
x/=10;
}
return 1;
}
long long qsm(long long x,int y)//快速幂
{
long long z=1;
while(y)
{
if(y&1)
{z=z*x%m;
z%=m;
}
x=x*x;
x%=m;
y>>=1;
}
return z;
}
long long g(int x,int y) //算组合数
{
if(x==0) return 1;
long long p,w;
p=c[x]*c[y-x];
p%=m;
w=c[y]*qsm(p,m-2);//这里乘了逆元
w%=m;
return w;
}
int main()
{
int i,j,k;
long long sum=0;
scanf("%d%d%lld",&a,&b,&n);
for(i=1,c[0]=1;i<=n;i++) //准备阶乘表
{
c[i]=c[i-1]*i;
c[i]%=m;
}
k=b-a;
for(i=a*n,j=0;j<=n;i+=k,j++) //这个循环枚举各个美丽数各位相加的结果
{
if(cheak(i))
{
sum=sum+g(j,n);
sum%=m;
}
}
printf("%lld\n",sum);
return 0;
}