Summer Training #13 Div.2 I(数学)

题目链接  Gym 100541B

题意:求[n/1]+[n/2]+....+[n/n]  (1<n<10^12)

题解:当分母比较大时,连续一段区间内[n/i]为定值,如[n/2]+1——[n],[n/i]皆为1,而当分母比较小时,则可以通过暴力来求解,可将表达式分为两部分来计算,分母为1——[sqrt(n)]与[sqrt(n)]+1——[n]来计算,复杂度为O(sqrt(n))

代码

 

 

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<queue>
#include<vector>
#include<map>
using namespace std;
#define N 105

int main(){
    int T,j;
    long long int i;
    long long int ans=0,n;
    scanf("%d",&T);
    while(T--){
        ans=0;
        scanf("%lld",&n);
        long long int t=floor(sqrt(n));
        for(i=1;i<=t;i++){
           ans+=(n/i-n/(i+1))*i;
        }
        int temp=n/(t+1);
        for(i=1;i<=temp;i++){
            ans+=n/i;
        }
        ans%=1000000;
        printf("%d\n",ans);

    }
    return 0;
}
View Code

 

posted @ 2016-07-26 00:16  flowing_water  阅读(119)  评论(0)    收藏  举报