Блог пользователя Polar_

Автор Polar_, история, 6 лет назад, По-английски

Hi! I need help in calculating $$$\sum\frac{1}{n^2}\%MOD$$$.
Where $$$MOD$$$ is a prime number .
I know that taking of inverse modulo for every $$$k^2$$$ where $$$ 1 \le k \le n $$$ then adding them up and taking modulo.
But if $$$n$$$ is order of $$$10^9$$$ then how to do it ?
Any faster way to do it ?
Thanks .

  • Проголосовать: нравится
  • +6
  • Проголосовать: не нравится

»
6 лет назад, скрыть # |
Rev. 3  
Проголосовать: нравится -18 Проголосовать: не нравится

[Wrong approach]

If I dont understand wrong. just calculate S = the total sum of 1 / k^2 for every 1 ≤ k ≤ n in O(sqrt(n))

Then the result will be S % MOD = S — floor(S / MOD) * MOD

»
6 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

How large can $$$MOD$$$ be?

»
6 лет назад, скрыть # |
 
Проголосовать: нравится +18 Проголосовать: не нравится
The answer is

Seriously, maybe this sum can be simplified if you express its summands as degrees of some primitive root.

»
6 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

Here's an idea: the sum for even $$$n$$$ is $$$\frac{1}{4}\sum_{n=1}^{N/2} \frac{1}{n^2}$$$, the rest is the sum for odd $$$n$$$. This way, you can split the sum based on the smallest few primes in the decomposition of $$$n$$$ in the summands. There aren't that many primes below $$$10^9$$$ and small enough sums can be precomputed, so this could give a decent runtime.

Also note that $$$(ab)^{-1} = a^{-1} \cdot b^{-1}$$$, which saves a lot of time spent on computing modular inverses.

»
6 лет назад, скрыть # |
Rev. 2  
Проголосовать: нравится +11 Проголосовать: не нравится

You can precompute each sum with step $$$10^6$$$. On ideone for range $$$10^7$$$ runtime is $$$1.32$$$ seconds, then for $$$10^9$$$ runtime is $$$132$$$ seconds (two minutes). Now you know each sum with step $$$10^6$$$ and can copy-paste array into code. So, you can find any required sum with precalculated values by addition at most $$$10^6$$$ terms.