C. Beautiful Numbers 组合数+求逆元

C. Beautiful Numbers
这里求逆元用的 费马小定理

#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int N=1e6+1;
ll fact[N];
void initfact(){//初始化阶乘矩阵 Cn,m=n!/(m!*(n-m)!) 
	fact[0]=1;
	for(int i=1;i<N;i++){
		fact[i]=(fact[i-1]*i%mod);
	}
}
bool check(ll sum,int a,int b){
	while(sum){
		int x=sum%10;
		if(x!=a&&x!=b)return false;
		sum/=10;
	}
	return true;
} 
ll quickPow(ll b,ll e){
	b%=mod;
	ll res=1;
	while(e){
		if(e&1)res=res*b%mod;
		b=b*b%mod;
		e>>=1;
	}
	return res;
}
ll getC(int n,int m){
//	return fact[n]/fact[n-m]/fact[m];
	return fact[n]*quickPow(fact[n-m],mod-2)%mod*(quickPow(fact[m],mod-2))%mod;
}
int main(){
	int a,b,n;
	cin>>a>>b>>n;
	//n位的excellent数(每一位要么a要么b) 各位相加的和 每一位要么a要么b 
//	假设有i位是a,则各位相加的和等于a*i+b*(n-i)
	initfact();
	ll cnt=0;
	 for(int i=0;i<=n;i++){
	 	ll sum=a*i+b*(n-i);
	 	if(check(sum,a,b)){
	 		cnt+=getC(n,i);
	 		cnt%=mod;
		 }
	 }
	cout<<cnt;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值