无耻打表水过

题目链接
数据是4e6,本地测了下我的代码4e6会超时,但是2e6可以稳稳水过,于是,当给定的n超过2e6时,

if (n > 2000000) {
        st = 2000001;
        ans = 220078001;
    }

就这样无耻的打个表的水过了。

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 4e6 + 5, mod = 1e9 + 7;
int p[N];
int f[N];
bool v[N];
int cnt;
void init(int n)
{
    int cnt = 0;
    for (int i = 2; i <= n; i++) {
        if( !v[i] ) p[++cnt] = i;
        for (int j = 1; j <= cnt; j++) {
            if (i * p[j] > n) break;
            v[ i * p[j] ] = i;
            if ( i % p[j] == 0 ) break;
        }
    }
}
int devide(int n)
{
    int ret = 0;
    int num = 1;
    int k = 0;
    for (int i = 1; p[i] * p[i] <= n; i++) {
        if (n % p[i] == 0) {
            while (n % p[i] == 0) {
                n /= p[i];
                f[++k] = p[i];
            }
        }
    }
    if (n > 1) f[++k] = n;
    for (int i = k; i >= 1; i--) {
        ret = (ret + f[i] * num) % mod;
        double ws = log10(f[i]);
        int z = ws;
        if (ws - z > 0) z++;
        int kk = pow(10, z);
        num = num * kk % mod;
    }
    return ret % mod;
}
signed main()
{
    int n;
    cin >> n;
    /* clock_t start, stop;
    start=clock(); */
    init(n);
    int ans = 0;
    int st = 2;
    if (n > 2000000) {
        st = 2000001;
        ans = 220078001;
    }
    for (int i = st; i <= n; i++) {
        if (v[i] == 0) {
            ans += i;
            continue;
        }
        ans = (ans + devide(i)) % mod;
        // cout << ans << " ";
    }
    cout << ans;
    /* stop = clock();
    cout << endl << stop - start; */
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值