F-Beautiful Numbers_牛客竞赛数学专题班简单排列和组合(排列组合问题、阶乘、组合数) (nowcoder.com)
给你两个数字 a和 b。一个数是由 a,b两种数字构成,那么这个数是good数;这个数的每一位加起来构成新的一个数,并且新数也是一个good数,那么称原数为excell。
求 n位数中有多少个数是excell,输 mod 109+7 后的结果。
注意, n位数不能有前导0。
1e6=>n>=1
这题可以先找出n位数中a和b有多少个才符合excell数,假设有i个a可以符合excell,便可求得到所有的i个a的excell数
答案就是 (当i*a+b*(n-i)也是一个good数的时候i成立)
代码如下:
#include<stdio.h>
#define ll long long
const int mod=1e9+7;
ll q_pow(ll a,ll b) //快速幂求逆元
{
ll t=1;
while(b)
{
if(b&1)t=t*a%mod;
a=a*a%mod;
b>>=1;
}
return t;
}
ll C(ll a,ll b) //求组合数
{
ll t=1;
for(int i=a;i>(a-b);i--)
{
t=t*i%mod;
}
ll m=1;
for(int i=2;i<=b;i++)
m=m*i%mod;
return t*q_pow(m,mod-2);
}
int main()
{
ll a,b,c,res=0;
scanf("%lld%lld%lld",&a,&b,&c);
for(int i=0;i<=c;i++)
{
ll t=a*i+b*(c-i);
int flag=1;
while(t) //判断是否为good数
{
int k=t%10;
t/=10;
if(k==a)continue;
if(k==b)continue;
flag=0;
break;
}
if(flag)
{
res=(res+C(c,i))%mod;
}
}
printf("%lld",res);
}