数论题,注意以下性质:

(1) 若 \( divisor | F(n) \) 则必存在整数 \(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\) 不是质数则性质不成立,因此原题转换为如下问题:

求区间 \( [lo, hi] \) 内满足 \( n \equiv r^2 (mod \ divisor) (r \in \mathbf{N}且n>r^2) \) 的所有不同的n的个数

利用同余的性质来对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\) 的余数进行划分,对每一个划分,只保留最小的那个 \(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\) 所在的区间 \([lo, hi]\),

【优化】

更深层次的推导可以得出以下结论:

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

猜测应该跟同余性质有关,但不知道怎么证,下面只给出没有优化过的代码

 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

转载于:https://www.cnblogs.com/valaxy/p/3407392.html

SRM596 DIV2 1000相关推荐

  1. Topcoder Srm 671 Div2 1000 BearDestroysDiv2

    \(>Topcoder \space Srm \space 671 \space Div2 \space 1000 \space BearDestroysDiv2<\) 题目大意 : 有一 ...

  2. TopCoder SRM 577 Div2 1000 EllysCoprimesDiv2

    今天不知道是网卡还是TC的问题一直爆炸,这题还是在vj上交的 插件再次神秘失踪 自己装了插件貌似哪里没弄好..反正很奇怪 辣鸡TC毁我青春 打CF去了 不太懂为什么这种题也是1000 // BEGIN ...

  3. SRM596 DIV2 250

    一般编程题,如果用数组来处理,注意中间要忽略的城市 1 class FoxAndSightseeing: 2 def getMin(self, position): 3 minx = 99999999 ...

  4. TC SRM 593 DIV2 1000

    很棒的DP,不过没想出,看题解了..思维很重要. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstrin ...

  5. Topcoder SRM 636 div2 1000

    可能个人的代码简写方式和大家的有点不同,读起来有点不适应,还望正在读此篇博客的acmer多多包涵! #include <cstdlib> #include <cctype> # ...

  6. 动态规划总结与题目分类

    源博客链接:http://blog.csdn.net/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少 ...

  7. 『ACM-算法-动态规划』初识DP动态规划算法

    一.多阶段决策过程的最优化问题 在现实生活中,有类活 动的过程,由于 它的特殊性,可将过程分成若干个互相阶段.在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果.当阶段决策的选取不是任意确 ...

  8. (转)dp动态规划分类详解

    dp动态规划分类详解 转自:http://blog.csdn.NET/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间 ...

  9. 《动态规划》— 动态规划分类

    动态规划(英语:Dynamic programming,DP)是一种在数学.计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法. 动态规划常常适用于有重叠子问题和最 ...

最新文章

  1. Java Spring @Scheduled 定时任务crontab表达式设置
  2. nginx详细配置文件 (转)
  3. 诚毅学院全国计算机考试,集美大学2017年9月全国计算机等级考试报名时间
  4. 张帅用赢球庆生 搭档斯托瑟晋级澳网女双八强
  5. windows下在一台电脑上配置多个git账号
  6. 通过基于JDBC的用户存储部署Identity Server
  7. [2020-CVPR] Dynamic Region-Aware Convolution 论文简析
  8. python与lua闭包的一点不同
  9. dc持久内存与mysql_为什么持久性内存会改变你的世界!
  10. 第五课--使用定时器实现中断(1)
  11. 分享一个超酷创建互动文档的Javascript类库 - tangle
  12. linux服务器网卡查看,Linux操作系统下如何查看网卡当前版本
  13. EMC、EMI、EMS和ESD的定义、区别和测试项
  14. 这表白代码让我虎躯一震!
  15. RulersGuides.js – 网站中实现 Photoshop 标尺效果
  16. 浏览器打印功能print.js
  17. SpringBoot 三大开发工具,你都用过么?
  18. Hudson使用之执行Hudson
  19. Audio声音模式定制--声音大小定制
  20. 从心出发,华展云2.0荣耀发布

热门文章

  1. linux:su认证失败
  2. 剑指offer:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。
  3. 【Scratch】青少年蓝桥杯_每日一题_7.09_加减大师
  4. 第十一届蓝桥杯大赛青少组 Python 真题 - 第二题
  5. Java 洛谷 P1482 Cantor表(升级版)
  6. Android --- Android Studio 内无法直接运行 main 方法
  7. mongodb 重启_mongodb历险记
  8. 电厂运维的cis数据_数据中心运维,太难难难了
  9. 期末小作品图片_三年级语文期末满分作文《我想变成什么》,老师:你真懂事...
  10. python压测接口_python的一个接口压测脚本