GDUT_寒假训练题解报告_数论专题_个人题解报告——题目:D - Beautiful Numbers (CodeForces - 300C)【逆元、组合数公式】

原题链接http://codeforces.com/problemset/problem/300/C

题目:

Vitaly is a very weird man. He’s got two favorite digits a and b. Vitaly calls a positive integer good, if the decimal representation of this integer only contains digits a and b. Vitaly calls a good number excellent, if the sum of its digits is a good number.

For example, let’s say that Vitaly’s favourite digits are 1 and 3, then number 12 isn’t good and numbers 13 or 311 are. Also, number 111 is excellent and number 11 isn’t.

Now Vitaly is wondering, how many excellent numbers of length exactly n are there. As this number can be rather large, he asks you to count the remainder after dividing it by 1000000007 (109 + 7).

A number’s length is the number of digits in its decimal representation without leading zeroes.

Input

The first line contains three integers: a, b, n (1 ≤ a < b ≤ 9, 1 ≤ n ≤ 106).

Output

Print a single integer — the answer to the problem modulo 1000000007 (109 + 7).

Examples

Input

1 3 3

Output

1

Input

2 3 10

Output

165

这个东西容易想到就是找出x个a,y个b,然后ax+by也为漂亮数的x和y,然后来一个排列组合,但是x个a和y个b咋整呢?变换一下思维,就是x+y个空格,选出x个为a,y个为b,也就是C(x,x+y)就可以了,然后是组合公式:(x+y)! / ( (x!)! * (y)! )就行了
我们再来一个费马小的运用乘法逆元就可以解决这个除法问题。

说道乘法逆元就要来一个快速幂了,那么快速幂我采用了较为简单的递归写法:

LL pow(LL a,int  b)
{//a的b次方
	if(b==0)return 1;

	LL temp=pow(a,b>>1);
	temp=(temp*temp)%mod;
	if(b&1)temp*=a;
	return temp%mod;
}

完整代码:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <climits>
#include <queue>
#include <stack>
#include <map>
//鬼畜头文件
using namespace std;
#define INF 0x3f3f3f3f
#define ULL unsigned long long
#define LL long long
const int mod =1e9+7;
//鬼畜define
int a,b,n;
LL pow(LL a,int  b)
{//a的b次方
	if(b==0)return 1;

	LL temp=pow(a,b>>1);
	temp=(temp*temp)%mod;
	if(b&1)temp*=a;
	return temp%mod;
}
LL pouch(int k)
{
	LL num=1;
	for(LL time=2;time<=k;time++)
	{
		num*=time;
		num%=mod;
	}
	return num;
}
bool check(int k)
{
	while(k>0)
	{
		if(!(k%10==a||k%10==b))return false;
		k/=10;
	}
	return true;
}
int main()
{
	scanf("%d %d %d",&a,&b,&n);
	int x=0,y=n;
	LL p=pouch(n);
	LL ans=0;
	while(x<=n)
	{
		int num=x*a+y*b;
		if(check(num))
		{
			ans+=p*pow(  pouch(x)*pouch(n-x)%mod  , mod-2 )%mod;
			ans%=mod;
		}
		x++;
		y--;
	}
	printf("%lld\n",ans);

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值