Gym 101615C 【数学思维】

传送门
//题意: 给定一个L, R(均小于1e12 但是R - L <= 1e6 的), 然后求sigma(f(i)) ( L <= i <= R) , f(n)的定义是n的所有的因子之和(包括1和本身).
//思路: 我的第一想法就是用约数个数和定理, 但是想了一会就否定了这个想法, 因为复杂度确实是不能过关的, 然后有一个想法就是统计每一个数字的贡献度, 因为因子是双向的, 那么我们求出一个后, 另一个也就出来了, 就是要注意下判平方数因子, 然后再特判1和本身的即可,写起来还是比较好写的.

AC Code

void solve() {
    ll L,R;
    while(~scanf("%lld%lld",&L,&R)){

        ll ans = 0; ll k = sqrt(R+0.5);
        for(int i=2;i<=sqrt(R+0.5);i++){
            ll tmp = (L-1)/i;
            for(ll j=tmp+1;j*i<=R;j++){
                if(j > k) ans += i + j;
                else ans += i;
            }
        }
        for(ll i=L;i<=R;i++){
            if(i>k) ans += 1+i;
            else ans += 1;
        }
        cout << ans << endl;
    }
}

你可能感兴趣的:(数的因子(约数),素数相关)