#include<bits/stdc++.h>
using namespace std;
int main(){
    long long n,ans=0;
    cin >> n;
    for(long long l=1,r;l<=n;l=r+1){
        r = n/(n/l);            //计算r,让分块右移
        ans += (r-l+1)*(n/l);   //求和
        cout << l <<""<< r <<": "<< n/r << endl;  //打印分块
    }
    cout << ans;               //打印和
}

ll ans=0;
for(ll l=1,r;l<=n;l=r+1)
{
    if(w/l)r=w/(w/l);
    else r=n;
    r=min(r,n);
    ans+=(r-l+1)*(w/l);
}
int prime[N],cnt=0; //prime数组存放所以素数,cnt为素数个数
bool st[N]; //false为素数
int phi[N]; //记录欧拉函数
void get_prime(int n){
    phi[1]=1;
    for(int i=2;i<=n;i++){
        if(!st[i]) prime[cnt++]=i,phi[i]=i-1; //把素数i存到prime数组中
        for(int j=0;j<cnt&&i*prime[j]<=n;j++){
            st[i*prime[j]]=true; //找到的素数的倍数不访问
            if(i%prime[j]==0){
                phi[i*prime[j]]=phi[i]*prime[j];
                break;
            }
            phi[i*prime[j]]=phi[i]*phi[prime[j]];
        }
    }
}

高精度gcd(Stein算法)

int stein(int a,int b){
    if(a<b) a^=b,b^=a,a^=b;        //交换,使a为较大数; 
    if(b==0)return a;                    //当相减为零,即两数相等时,gcd=a; 
    if((!(a&1))&&(!(b&1))) return stein(a>>1,b>>1)<<1;   //s1,注意最后的左移,在递归返回过程中将2因子乘上;
    else if((a&1)&&(!(b&1)))return stein(a,b>>1);            //s2;
    else if((!(a&1))&&(b&1))return stein(a>>1,b);
    else return stein(a-b,b);                                             //s3;  
}