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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章