51nod 1225 餘數求和(分塊)

2021-07-11 15:57:35 字數 1303 閱讀 5857

f(n) = (n % 1) + (n % 2) + (n % 3) + ...... (n % n)。其中%表示mod,也就是餘數。 

例如f(6) = 6 % 1 + 6 % 2 + 6 % 3 + 6 % 4 + 6 % 5 + 6 % 6 = 0 + 0 + 0 + 2 + 1 + 0 = 3。

給出n,計算f(n), 由於結果很大,輸出mod 1000000007的結果即可。

input

輸入1個數n(2 <= n <= 10^12)。
output

輸出f(n) mod 1000000007的結果。
input示例

6
output示例

3

我們知道餘數m= n-n/i*i;

顯然sigma(i)n/i,n/i的值在一定區間內是不變的

於是根據n/i做公比,分塊搞搞等比數列求和就好啦~,複雜度o(sqrt(n))。

//#include #include #include #include #include #define inf 0x3f3f3f3f

#define ll long long

#define bug cout<<"bug\n"

using namespace std;

const int maxn = 1e7+7;

const int maxm = 1e9+7;

const long long mod = 1e9+7;

// m= n-n/i*i;

long long quick_pow(long long a,long long n)

return ans;

}long long inv(long long a)

int main()

{ long long n;

long long ans=0;

long long c=inv(2);

while(~scanf("%i64d",&n))

{for(long long i=1,j; i<=n; i=j+1)

{j=n/(n/i);

long long d=(n/i)%mod;

long long m=(j-i+1)%mod;

long long a1=(n-d*i)%mod;

ans+=(m*a1-(m-1)%mod*m%mod*c%mod*d%mod)%mod;

ans%=mod;

// cout<"<

51nod1225 餘數之和(分塊)

1.0 秒 131,072.0 kb 80 分 5級題 f n n 1 n 2 n 3 n n 其中 表示mod,也就是餘數。例如f 6 6 1 6 2 6 3 6 4 6 5 6 6 0 0 0 2 1 0 3。給出n,計算f n 由於結果很大,輸出mod 1000000007的結果即可。輸入輸入...

51Nod 1225 餘數之和

acm模版 對於數論只會打表找規律的我來說,我一上來就打了一張表,然後發掘其中的規律 沒法子,腦子跟不上,推不出來規律,只能找規律。通過這個表我們可以發現 從第100項到51項是等差數列0 49,base 1 從第50項到34項是等差數列0 32,base 2 從第33項到26項是等差數列1 22,...

51 Nod 1225 餘數之和

基準時間限制 1 秒 空間限制 131072 kb 分值 80 難度 5級演算法題 f n n 1 n 2 n 3 n n 其中 表示mod,也就是餘數。例如f 6 6 1 6 2 6 3 6 4 6 5 6 6 0 0 0 2 1 0 3。給出n,計算f n 由於結果很大,輸出mod 100000...