Summer Training #13 Div.2 I(数学)
题意:求[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; }

浙公网安备 33010602011771号