为什么CE
  • 板块学术版
  • 楼主zhang_kevin
  • 当前回复10
  • 已保存回复10
  • 发布时间2022/10/21 22:03
  • 上次更新2023/10/27 06:36:26
查看原帖
为什么CE
679961
zhang_kevin楼主2022/10/21 22:03
#include <stdio.h>
const int N = 1e6 + 1;
int T, n;
int dp[N + 1][3] = { 0, 0, 0, 1, 1, 1 };
int sum[N + 1]={};
int start[N + 1]={};
int p = 1000000007;
long long pro[N + 1] = {0, 1}, inv[N + 1] = {0, 1}, buf[N + 1] = {0, 1};
int main() {
    for (int i = 1; i <= N; i++) {
        start[i] = dp[i][0] > dp[i - 1][0] ? i : start[i - 1];
        sum[i] = (sum[i - 1] + (dp[start[i]][0] == dp[i][0] ? dp[i][1] : 0)) % p;
        for (int j = i << 1; j <= N; j += i) {
            if (dp[i][0] + 1 == dp[j][0]) {
                dp[j][1] = (dp[j][1] + j + dp[i][1]) % p;
                dp[j][2]++;
            }else if (dp[i][0] >= dp[j][0]) {
                dp[j][1] = ((long long)j * dp[i][2] % p + dp[i][1]) % p;
                dp[j][0] = dp[i][0] + 1;
                dp[j][2] = dp[i][2];
            }
        }
    }
    for (int i = 2; i <= N; i++)
        pro[i] = pro[i - 1] * i % p,
        buf[i] = (p - p / i) * buf[p % i] % p,
        inv[i] = inv[i - 1] * buf[i] % p;
    scanf("%d", &T);
    while (T--) {
        scanf("%d", &n);
        printf("%lld\n", (sum[n] - sum[start[n] - 1] + p) % p * (pro[n] * inv[dp[start[n]][0]]) % p);
    }return 0;
}
2022/10/21 22:03
加载中...