SRM596 DIV2 1000
数论题,注意以下性质:
(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相关推荐
- Topcoder Srm 671 Div2 1000 BearDestroysDiv2
\(>Topcoder \space Srm \space 671 \space Div2 \space 1000 \space BearDestroysDiv2<\) 题目大意 : 有一 ...
- TopCoder SRM 577 Div2 1000 EllysCoprimesDiv2
今天不知道是网卡还是TC的问题一直爆炸,这题还是在vj上交的 插件再次神秘失踪 自己装了插件貌似哪里没弄好..反正很奇怪 辣鸡TC毁我青春 打CF去了 不太懂为什么这种题也是1000 // BEGIN ...
- SRM596 DIV2 250
一般编程题,如果用数组来处理,注意中间要忽略的城市 1 class FoxAndSightseeing: 2 def getMin(self, position): 3 minx = 99999999 ...
- TC SRM 593 DIV2 1000
很棒的DP,不过没想出,看题解了..思维很重要. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstrin ...
- Topcoder SRM 636 div2 1000
可能个人的代码简写方式和大家的有点不同,读起来有点不适应,还望正在读此篇博客的acmer多多包涵! #include <cstdlib> #include <cctype> # ...
- 动态规划总结与题目分类
源博客链接:http://blog.csdn.net/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少 ...
- 『ACM-算法-动态规划』初识DP动态规划算法
一.多阶段决策过程的最优化问题 在现实生活中,有类活 动的过程,由于 它的特殊性,可将过程分成若干个互相阶段.在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果.当阶段决策的选取不是任意确 ...
- (转)dp动态规划分类详解
dp动态规划分类详解 转自:http://blog.csdn.NET/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间 ...
- 《动态规划》— 动态规划分类
动态规划(英语:Dynamic programming,DP)是一种在数学.计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法. 动态规划常常适用于有重叠子问题和最 ...
最新文章
- Java Spring @Scheduled 定时任务crontab表达式设置
- nginx详细配置文件 (转)
- 诚毅学院全国计算机考试,集美大学2017年9月全国计算机等级考试报名时间
- 张帅用赢球庆生 搭档斯托瑟晋级澳网女双八强
- windows下在一台电脑上配置多个git账号
- 通过基于JDBC的用户存储部署Identity Server
- [2020-CVPR] Dynamic Region-Aware Convolution 论文简析
- python与lua闭包的一点不同
- dc持久内存与mysql_为什么持久性内存会改变你的世界!
- 第五课--使用定时器实现中断(1)
- 分享一个超酷创建互动文档的Javascript类库 - tangle
- linux服务器网卡查看,Linux操作系统下如何查看网卡当前版本
- EMC、EMI、EMS和ESD的定义、区别和测试项
- 这表白代码让我虎躯一震!
- RulersGuides.js – 网站中实现 Photoshop 标尺效果
- 浏览器打印功能print.js
- SpringBoot 三大开发工具,你都用过么?
- Hudson使用之执行Hudson
- Audio声音模式定制--声音大小定制
- 从心出发,华展云2.0荣耀发布
热门文章
- linux:su认证失败
- 剑指offer:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。
- 【Scratch】青少年蓝桥杯_每日一题_7.09_加减大师
- 第十一届蓝桥杯大赛青少组 Python 真题 - 第二题
- Java 洛谷 P1482 Cantor表(升级版)
- Android --- Android Studio 内无法直接运行 main 方法
- mongodb 重启_mongodb历险记
- 电厂运维的cis数据_数据中心运维,太难难难了
- 期末小作品图片_三年级语文期末满分作文《我想变成什么》,老师:你真懂事...
- python压测接口_python的一个接口压测脚本