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

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