Codeforces Round 952 (Div. 4) G. D-Function 题解 数学 数论

D-Function

题目描述

Let D ( n ) D(n) D(n) represent the sum of digits of n n n. For how many integers n n n where 1 0 l ≤ n < 1 0 r 10^{l} \leq n < 10^{r} 10ln<10r satisfy D ( k ⋅ n ) = k ⋅ D ( n ) D(k \cdot n) = k \cdot D(n) D(kn)=kD(n)? Output the answer modulo 1 0 9 + 7 10^9+7 109+7.

输入描述

The first line contains an integer t t t ( 1 ≤ t ≤ 1 0 4 1 \leq t \leq 10^4 1t104) – the number of test cases.

Each test case contains three integers l l l, r r r, and k k k ( 0 ≤ l < r ≤ 1 0 9 0 \leq l < r \leq 10^9 0l<r109, 1 ≤ k ≤ 1 0 9 1 \leq k \leq 10^9 1k109).

输出描述

For each test case, output an integer, the answer, modulo 1 0 9 + 7 10^9 + 7 109+7.

提示

For the first test case, the only values of n n n that satisfy the condition are 1 1 1 and 2 2 2.

For the second test case, the only values of n n n that satisfy the condition are 1 1 1, 10 10 10, and 11 11 11.

For the third test case, all values of n n n between 10 10 10 inclusive and 100 100 100 exclusive satisfy the condition.

题面翻译

D ( n ) D(n) D(n) 代表 n n n 各个数位上数字之和。求:有多少个 n n n 满足 1 0 l ≤ n < 1 0 r 10^{l} \leq n < 10^{r} 10ln<10r D ( k ⋅ n ) = k ⋅ D ( n ) D(k \cdot n) = k \cdot D(n) D(kn)=kD(n)?答案对 1 0 9 + 7 10^9+7 109+7 取模。

样例 #1

样例输入 #1

6
0 1 4
0 2 7
1 2 1
1 2 3
582 74663 3
0 3 1

样例输出 #1

2
3
90
12
974995667
999

原题

Codeforces——传送门
洛谷——传送门

思路

对于 D ( k ⋅ n ) = k ⋅ D ( n ) D(k \cdot n) = k \cdot D(n) D(kn)=kD(n)我们观察可以得到 左式一定小于等于右式。因为右式是对每一位数字都乘以 k k k 再相加,左式对 n n n 中每一位数字乘以 k k k 后要先处理进位再相加,而每发生一次进位都会导致最后得到的和少了 10 10 10。所以如果要满足 D ( k ⋅ n ) = k ⋅ D ( n ) D(k \cdot n) = k \cdot D(n) D(kn)=kD(n),则 k k k 乘以每一位都不能 ≥ 10 ≥10 10,即对于 n n n 中的任意一位数字 x x x,需满足 x ∗ k ≤ 9 x*k≤9 xk9

因为 x ∗ k ≤ 9 x*k≤9 xk9,所以对于 n n n 的每一位,若该位为最高位,则 x x x 不能为 0 0 0,可满足的位数字有 k 9 \frac{k}{9} 9k 种;若该位不为最高位,则可满足的位数字有 k 9 + 1 \frac{k}{9}+1 9k+1 种。因此对于 1 0 i ≤ n < 1 0 i + 1 10^{i}≤n<10^{i+1} 10in<10i+1,满足条件的 n n n 的个数有 k 9 ∗ ( k 9 + 1 ) i \frac{k}{9}*(\frac{k}{9}+1)^{i} 9k(9k+1)i 个。那么答案就是 k 9 ∗ ( k 9 + 1 ) r − 1 − k 9 ∗ ( k 9 + 1 ) l − 1 \frac{k}{9}*(\frac{k}{9}+1)^{r-1}-\frac{k}{9}*(\frac{k}{9}+1)^{l-1} 9k(9k+1)r19k(9k+1)l1,利用等比数列求和公式化简得 ( k 9 + 1 ) r − ( k 9 + 1 ) l (\frac{k}{9}+1)^{r}-(\frac{k}{9}+1)^{l} (9k+1)r(9k+1)l当然也可以不化简直接计算结果。

代码

#include <bits/stdc++.h>
using namespace std;
using i64 = long long;

const i64 mod = 1e9 + 7;
// 快速幂
i64 qpow(i64 a, i64 b, i64 c)
{
    i64 ans = 1;
    a %= c;
    while (b)
    {
        if (b & 1)
        {
            ans = (ans * a) % c;
        }
        a = (a * a) % c;
        b >>= 1;
    }
    return ans % c;
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);

    int t;
    cin >> t;
    while (t--)
    {
        i64 l, r, k;
        cin >> l >> r >> k;
        i64 num = 9 / k + 1;
        cout << (qpow(num, r, mod) - qpow(num, l, mod) + mod) % mod << '\n';
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值