题目

源地址:

http://poj.org/problem?id=2800

理解

抱着侥幸心理使用了一般的方法来求,果然TLE了。然后开始计算∑1<=i<=n(k mod i)。由分析之,总共有三种情况,k<n,k=n,k>n。分别寻找规律并转化为等差数列简化运算。

代码

#include <stdio.h>
#include <math.h>
using namespace  std;

long long jos( long long n , long long k )
{
    long long sum = 0 , a = ( long long  )  sqrt ( k ), b = k / a , i ;
    if ( n > k ) sum += ( n - k ) * k ;
    for ( i = a ; i > 1 ; i -- )
    {
        long long s = k / i , e = k / ( i - 1 ) ;
        if ( s > n ) break ;
        if ( e > n ) e = n ;
        sum += ( k % e + k % ( s + 1 ) ) * ( e - s ) / 2 ;
    }
    for ( i = 1 ; i <= n && i <= b ; i ++ ) sum += k % i ;
    return sum ;
}

int main(int argc, char const *argv[])
{
    long long n , k ;
    while ( scanf ( "%I64d%I64d", &n, &k ) != EOF )
        printf ( "%I64d\n" , jos(n, k) ) ;
    return 0 ;
}

更新日志

  • 2014年07月15日 已AC。