UOJ Logo

NOI.AC

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#213130#2356. CountKXG94354ms37500kbC++112.4kb2024-11-09 20:45:022024-11-09 23:17:47

answer

#include <cstdio>
#include <algorithm>
using namespace std;
const long long mod = 1e9 + 7;
const int maxn = 200000;
int prime[maxn + 10], tot, min_prime[maxn + 10];
bool np[maxn + 10];
long long inv[maxn + 10], invfac[maxn + 10], fac[maxn + 10];
void init() {
    np[1] = true;
    for (int i = 2; i <= maxn; i++) {
        if (!np[i]) {
            prime[++tot] = i;
            min_prime[i] = i;
        }
        for (int j = 1; j <= tot && 1ll * i * prime[j] <= maxn; j++) {
            np[i * prime[j]] = true;
            min_prime[i * prime[j]] = prime[j];
            if (i % prime[j] == 0) break;
        }
    }
    inv[1] = 1;
    for (int i = 2; i <= maxn; i++) {
        inv[i] = (mod - mod / i) * inv[mod % i] % mod;
    }
    invfac[0] = 1;
    fac[0] = 1;
    for (int i = 1; i <= maxn; i++) {
        invfac[i] = invfac[i - 1] * inv[i] % mod;
        fac[i] = fac[i - 1] * i % mod;
    }
}
long long C(long long n, long long m) {
    if (m > n) {
        return 0;
    }
    return fac[n] * invfac[m] % mod * invfac[n - m] % mod;
}
int n, k, l1, l2;
long long dp[100010][20], sum[100010][20];
long long sumc[20];
long long ans1, ans2, ans3, ans4;
int main() {
    init();
    scanf("%d%d%d%d", &n, &k, &l1, &l2);
    for (int i = 1; i <= k; i++) {
        if (k % i == 0) {
            ans1++;
        }
    }
    dp[1][0] = 1;
    for (int i = 0; i < 20; i++) {
        for (int j = 0; j < l1; j++) {
            sumc[i] += C(j, i);
        }
        sumc[i] %= mod;
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 0; j < 20; j++) {
            if (dp[i][j]) {
                dp[i][j] %= mod;
                sum[i][j] += dp[i][j] * i;
                sum[i][j] %= mod;
                for (int k = 2 * i; k <= n; k += i) {
                    dp[k][j + 1] += dp[i][j];
                    sum[k][j + 1] += sum[i][j];
                }
            }
        }
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 0; j < 20; j++) {
            ans2 += sumc[j] * dp[i][j] % mod;
        }
        ans2 %= mod;
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 0; j < min(20, l2); j++) {
            ans3 += dp[i][j];
            ans4 += sum[i][j];
        }
        ans3 %= mod;
        ans4 %= mod;
    }
    printf("%lld %lld %lld %lld\n", ans1, ans2, ans3, ans4);
    return 0;
}

详细

小提示:点击横条可展开更详细的信息

Test #1:

score: 7
Acceptable Answer
time: 11ms
memory: 6260kb

input:

5 0 7 3

output:

0 126 6 26

result:

points 0.70 wrong correct correct correct

Test #2:

score: 7
Acceptable Answer
time: 12ms
memory: 6260kb

input:

8 0 9 4

output:

0 807 14 108

result:

points 0.70 wrong correct correct correct

Test #3:

score: 10
Accepted
time: 14ms
memory: 6260kb

input:

10 1 10 5

output:

1 1585 19 171

result:

points 1.0 correct correct correct correct

Test #4:

score: 10
Accepted
time: 13ms
memory: 6412kb

input:

500 2 996 6

output:

2 370442183 13552 5619309

result:

points 1.0 correct correct correct correct

Test #5:

score: 10
Accepted
time: 16ms
memory: 6500kb

input:

800 233 966 7

output:

2 31028437 32745 22476650

result:

points 1.0 correct correct correct correct

Test #6:

score: 10
Accepted
time: 12ms
memory: 6568kb

input:

1000 666 999 10

output:

12 494787167 48614 41846205

result:

points 1.0 correct correct correct correct

Test #7:

score: 10
Accepted
time: 58ms
memory: 21880kb

input:

50000 2048 98673 100

output:

12 795207831 42179339 148036147

result:

points 1.0 correct correct correct correct

Test #8:

score: 10
Accepted
time: 55ms
memory: 31256kb

input:

80000 65535 25192 50

output:

16 857081183 94939299 733768189

result:

points 1.0 correct correct correct correct

Test #9:

score: 10
Accepted
time: 76ms
memory: 37496kb

input:

100000 23333 99696 12

output:

2 921281341 139356052 982603214

result:

points 1.0 correct correct correct correct

Test #10:

score: 10
Accepted
time: 87ms
memory: 37500kb

input:

100000 89941 99669 6

output:

4 684798865 39157829 910194864

result:

points 1.0 correct correct correct correct