#数论#洛谷 2261 余数之和

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sugar_free_mint/article/details/82025516

题目

给定 n k ,求

( k mod 1 ) + ( k mod 2 ) + + ( k mod n 1 ) + ( k mod n )


分析

因为 ( k mod n ) = k k ÷ n ,所以最终答案=

n × k i = 1 n k ÷ i × i

因为还是会超时,所以要用一种分块的思想,
g ( x ) = k ÷ k ÷ x
,那么
g ( x ) k ÷ ( k ÷ x ) = x

k ÷ g ( x ) k ÷ ( k ÷ k ÷ x ) = k ÷ x
,所以
k ÷ g ( x ) = k ÷ x

然后用等差数列求答案即可


代码

#include <cstdio>
#include <algorithm>
long long n,k,ans;
int main(){
    scanf("%lld%lld",&n,&k); ans=n*k;
    for (register long long x=1,gx;x<=n;x=gx+1){
        gx=k/x?std::min(k/(k/x),n):n;//有约数为x
        ans-=(k/x)*(x+gx)*(gx-x+1)>>1;//等差数列
    }
    printf("%lld",ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sugar_free_mint/article/details/82025516