数论分块

现在我们要求这玩意

,其中N<=1000000000000.

直接搞是肯定T的,观察会发现它很多值都是一样的,所以可以分块搞。

引入定理:1.的取值最多有种。

                  2.设,则

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    ll n;
    scanf("%lld",&n);
    ll ans=0;
    ll tmp=1;
    for(ll i=1;i<=n;i=tmp+1)
    {
        tmp=n/(n/i);
        ll temp=(n/i)*(tmp-i+1);
        ans+=temp;
    }
    printf("%lld\n",ans);
    return 0;
}

  

posted @ 2018-12-16 11:13  行远山  阅读(172)  评论(0编辑  收藏  举报