日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SRM596 DIV2 1000

發(fā)布時間:2025/3/21 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SRM596 DIV2 1000 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

數(shù)論題,注意以下性質(zhì):

(1) 若 \( divisor | F(n) \) 則必存在整數(shù) \(r\) 使得 \( n \equiv r^2 (mod \ divisor) (r \in \mathbf{N}且n>r^2)?\)

(2) 若?\( n \equiv r^2 (mod \ divisor) (r \in \mathbf{N}且n>r^2) \) 則必有?\( divisor | F(n) \)

若 \(divisor\) 不是質(zhì)數(shù)則性質(zhì)不成立,因此原題轉(zhuǎn)換為如下問題:

求區(qū)間 \( [lo, hi] \) 內(nèi)滿足 \( n \equiv r^2 (mod \ divisor) (r \in \mathbf{N}且n>r^2) \)?的所有不同的n的個數(shù)

利用同余的性質(zhì)來對n進行劃分:

定義 \( S(r) \) 為所有 \( n(r) \) 的集合

(1) 若 \( r_1^2 \not \equiv r_2^2 (mod \ divisor) \) 則 \( S(r_1) \cap S(r_2) = \emptyset \)

(2) 若 \( r_1^2 \equiv r_2^2 (mod \ divisor) ( r_1>r_2 ) \) 則 \( S(r_1) \subseteq S(r_2) \)

式(2)可以這樣來看,\(r\) 越小 \(n>r^2\) 造成的n的下限就越小,所以 \(S(r)\) 的范圍就越大

因此將所有的 \(n(r)\) 按照除以 \(divisor\) 的余數(shù)進行劃分,對每一個劃分,只保留最小的那個 \(r\) 的 \(S(r)\) 即 \(S(r_{min}) \)

若 \(n \leq max\)則:

\(S(r)=\{r^2+d, r^2+2d, r^2+3d, ..., r^2+kd \ | \ r^2+kd \leq max 且 r^2+(k+1)d > max \}\)

\(|S(r)|=(max-r^2) // divisor \)

\( \sum S(r_{min}) \) 即為所求,記得還要考慮 \(n\) 所在的區(qū)間 \([lo, hi]\),

【優(yōu)化】

更深層次的推導(dǎo)可以得出以下結(jié)論:

\( \sum_{r=0}^{divisor//2}S(r) \) 即為所求

猜測應(yīng)該跟同余性質(zhì)有關(guān),但不知道怎么證,下面只給出沒有優(yōu)化過的代碼

1 class SparseFactorialDiv2: 2 def getCount(self, lo, hi, divisor): 3 return self.calc(hi, divisor) - self.calc(lo-1, divisor) 4 5 def calc(self, ran, divisor): 6 mods = [False] * divisor 7 y = 0 8 tot = 0 9 while y * y < ran: 10 r = y * y % divisor 11 if not mods[r]: 12 mods[r] = True 13 tot += (ran - y*y) // divisor 14 y = y + 1 15 return tot 16 17 18 19 20 # test 21 o = SparseFactorialDiv2() 22 23 # test: hi == lo 24 assert(o.getCount(1,1, 3) == 0) 25 26 # test case 27 assert(o.getCount(4, 8, 3) == 3) 28 assert(o.getCount(9, 11, 7) == 1) 29 assert(o.getCount(1, 1000000000000, 2) == 999999999999) 30 assert(o.getCount(16, 26, 11) == 4) 31 assert(o.getCount(10000, 20000, 997) == 1211) 32 assert(o.getCount(123456789, 987654321, 71) == 438184668) 33 print('ok') View Code

?

轉(zhuǎn)載于:https://www.cnblogs.com/valaxy/p/3407392.html

總結(jié)

以上是生活随笔為你收集整理的SRM596 DIV2 1000的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。