題目描述
給你兩個數n,k,請求出的值。
5 4 5 3樣例輸出
5 7
題目分析:
對於此題不能直接進行暴力,數值大,只能用sqrt(n)的算法,首先計算n%i的余數和,i=1~n;注意到:n%i=n/i*i;
因此我們可以模擬從i=1~sqrt(n);sum+=n%i;對於i對應的j=n/i,可以知道(n/i~n/i+1)==d;對與這組數,計算得到
s1=((n/i-n/(i+1))*n)-d*(n/(i+1)+1+......+n/i);sum+=s1;直到循環結束,就得到n%i的余數和,我們用ModSum(n)。
現在我們求k%i的余數和,i=1~n;進行分析k和n即可,
一、k
二、k=n res=ModSum(k)
三、k>n res=ModSum(k); { for(int i=n+1;i<=n;i++)
res-=k%i;//減去多計算的值即可。
}
AC代碼:
/** *1、ModSum1():O(n) *2、ModSum2():O(sqrt(n)) *1 2 3 4 *16 8 5 4 * 1 2 3 */ #include#include #include