南邮 OJ 2077 Dreaming

Dreaming

时间限制(普通/Java) :  1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 96            测试通过 : 13 

比赛描述

我们定义一个数good当且仅当它只由ab构成,且数位和sum各数位也仅由ab构成。举个栗子:若a=1,b=2,那么13不是good11(都由a=1构成,数位和sum=2b=2构成)。那么窝们定义一个数的长度为n,那么有多少个数是good?所求答案对10^9+7取模。



输入

多组样例。

每行包含三个数a,b,n(1<=a,b<=9,1<=n<=10^6)

输出

每组数据输出一个整数。

样例输入

1 3 3

样例输出

1

题目来源

NUPT





/* Internet AC
#include <cstdio>
#define ll long long
int const MAX = 1e6 + 2;
int const MOD = 1e9 + 7;
ll fac[MAX];
int n, a, b;

void pre()
{
    fac[0] = fac[1] = 1;
    for(int i = 2; i <= MAX; i++)
        fac[i] = (fac[i - 1] * i) % MOD;
}

bool judge(int x)
{
    while(x)
    {
        if(x % 10 != a && x % 10 != b)
            return false;
        x /= 10;
    }
    return true;
}

ll inv(ll x)
{   
    ll res = 1, y = MOD - 2;
    while(y)
    {
        if(y & 1)
            res = (res * x) % MOD;
        x = (x * x) % MOD;
        y >>= 1;
    }
    return res;
}

ll C(int n, int m)
{
    return fac[n] * inv(fac[m]) % MOD * inv(fac[n - m]) % MOD;
}

int main()
{
    pre();
    while(scanf("%d %d %d", &a, &b, &n) != EOF)
    {
        int ans = 0;
        for(int i = 0; i <= n; i++) 
        {
            int sum = a * i + b * (n - i);
            if((sum % 10 != a) && (sum % 10 != b))
                continue;
            else if(judge(sum / 10))
                ans = (ans % MOD + C(n, i) % MOD) % MOD;
        }
        printf("%d\n", ans);
    }
}
*/

#include <cstdio>
#define ll long long
int const MAX = 1e6 + 2;
int const MOD = 1e9 + 7;
ll fac[MAX];
int n, a, b;

void pre()
{
    fac[0] = fac[1] = 1;
    for(int i = 2; i < MAX; i++)
        fac[i] = (fac[i - 1] * i) % MOD;
}

bool judge(int x)
{
    while(x)
    {
        if(x % 10 != a && x % 10 != b)
            return false;
        x /= 10;
    }
    return true;
}

//模逆元?
ll inv(ll x)
{   
    ll res = 1, y = MOD - 2;		//减2什么意思?
    while(y)
    {
        if(y & 1)
            res = (res * x) % MOD;
        x = (x * x) % MOD;
        y >>= 1;
    }
    return res;
}

ll C(int n, int m)
{
    return fac[n] * inv(fac[m]) % MOD * inv(fac[n - m]) % MOD;
}

int main()
{
    pre();
    while(scanf("%d %d %d", &a, &b, &n) != EOF)
    {
        int ans = 0;
        for(int i = 0; i <= n; i++) 
        {
            int sum = a * i + b * (n - i);		//数字由i个a和(n-i)个b组成
            if( judge(sum) )
                ans = ( ans + C(n, i) ) % MOD;
        }
        printf("%d\n", ans);
    }
}


你可能感兴趣的:(ACM,dreaming,南邮OJ)