Codeforces Round #330 (Div. 2) B. Pasha and Phone · 数学

题解

题意:长度为 n n n 的数被分成 k n \frac{k}{n} nk 块,要求每一块 i i i 的都能被 a i a_i ai 整除,且不能是以 b i b_i bi 开头,问满足要求的数有多少种

1 ∼ x 1\sim x 1x 之中,能被 p p p 整除的数有 ⌊ x p ⌋ \left\lfloor\frac{x}{p}\right\rfloor px 个,如果有0,答案 +1

每一块 k k k 位数,能被 a a a 整除的数总共有 1 0 k − 1 a + 1 \frac{10^k-1}{a} +1 a10k1+1

能被 a a a 整除的、又是以 b b b 开头的数总共有 b × 1 0 k − 1 − 1 a − ( b − 1 ) × 1 0 k − 1 − 1 a \frac{b\times 10^{k-1}-1}{a}-\frac{(b-1)\times 10^{k-1}-1}{a} ab×10k11a(b1)×10k11


Codeforces Round #330 (Div. 2) B. Pasha and Phone · 数学_第1张图片


代码

#include 
using namespace std;
typedef long long ll;
const int N = 1e6 + 10;
const int mod = 1e9 + 7;
int a[N], b[N];
int n, k;
int p[20];

int main() {
    ios::sync_with_stdio(0);

    p[0] = 1;
    for (int i = 1; i <= 9; ++i) {
        p[i] = p[i - 1] * 10;
    }

    cin >> n >> k;
    int block = n / k;
    for (int i = 1; i <= block; ++i) {
        cin >> a[i];
    }
    for (int i = 1; i <= block; ++i) {
        cin >> b[i];
    }

    ll res = 1;
    for (int i = 1; i <= block; ++i) {
        ll tmp1 = (p[k] - 1) / a[i] + 1;
        ll tmp2 = (p[k - 1] * (b[i] + 1) - 1) / a[i] + 1;
        ll tmp3 = (p[k - 1] * b[i] - 1) / a[i] + 1;
        if (!b[i]) tmp3 = 0; //没有这一块了

        res *= tmp1 - tmp2 + tmp3;
        res %= mod;
    }
    cout << res << endl;

    return 0;
}

你可能感兴趣的:(cf)