Luogu1445 [Violet]樱花 ---- 数论优化
Luogu1445 [Violet]樱花
一句话题意:(本来就是一句话的)
求方程 $\frac{1}{X} + \frac{1}{Y} = \frac{1}{N!}$ 的正整数解的组数,其中$N \leq 10^6$
题解:
差不多是第一篇公开的题解,因为以前的太烂了,不敢发......
我们观察到提交记录发现似乎时间有从200ms+到8ms-的,然而标准题解中给出的代码就是跑的比较慢的......
所以有没有什么快一点的呢?
假设此时你已经用朴素算法A过此题
于是我们分析算法:
楼下题解的复杂度是$O(nlogn+常数的)$,平均200ms
有没有什么更快的呢?
假设我们分析到了
$A*B=(n!)*(n!)$
的时候发现最终求的就是约数个数
首先如果求m的约数个数的话,那么对m分解得到
$m=p_1^{k_1}*p_2^{k_2}...$
其中$p_1,p_2,p_3...$都是质数
那么根据乘法原理
$Ans = (k_1 + 1) * (k_2 + 1)...$
然后对于阶乘来说,对n!做质因数分解实则在分解1 * 2 * ... * n
然而这个就是朴素的做法,然而由于你实则是需要求质因数的指数,而在《初等数论》中有
$\Sigma(p \leq n, p \ is \ a \ prime)\Sigma_{k=0}^{p^k \leq n}(\lfloor \frac{n}{p^k} \rfloor)$
所以我们直接递归(或者非递归地)跑这个公式即可
实际食用:枚举质数(或打表)(在阶乘下质因数等价于质数)(O(n)),然后对于所有质数,跑公式。
n内大约有n/ln(n)个质数,然后每次做都是log的,所以复杂度为O(n/ln(n) * log(n))=O(n),常数小,瓶颈在筛质数那......
代码如下:
//Source Code const int MAXN = ;
const int MODS = ; int n, tot;
int prime[MAXN];
bool is_not_prime[MAXN]; inline void Get_Prime(){
for(int i = ; i <= n; i++){
if(!is_not_prime[i])
prime[++tot] = i;
for(int j = ; j <= tot; j++){
if(i * prime[j] > n) break;
is_not_prime[i * prime[j]] = true;
if(!(i % prime[j])) break;
}
}
} inline int Get_D(const int &tar, const int &p){
if(tar < p) return ;
return tar / p + Get_D(tar / p, p);
} int main(){
Main_Init();
n = read();
Get_Prime();
long long ans = ;
for(int i = ; i <= tot; i++)
(ans *= (Get_D(n, prime[i]) << ) + ) %= MODS;
write('\n', ans);
Main_Init();
return ;
}
Luogu1445 [Violet]樱花 ---- 数论优化的更多相关文章
- Luogu1445 [Violet]樱花
题面 题解 $$ \frac 1x + \frac 1y = \frac 1{n!} \\ \frac{x+y}{xy}=\frac 1{n!} \\ xy=n!(x+y) \\ xy-n!(x+y) ...
- luogu1445 [violet]樱花 阶乘分解
题目大意 求方程$$\frac{1}{x}+\frac{1}{y}=\frac{1}{N!}$$的正整数解的组数. 思路 咱们把式子整理得$$xy-(x+y)N!=0$$.$xy$和$x+y$?貌似可 ...
- 「BZOJ2721」「LuoguP1445」 [Violet]樱花(数论
题目背景 我很愤怒 题目描述 求方程 $\frac{1}{x}+\frac{1}{y}=\frac{1}{N!}$ 的正整数解的组数,其中$N≤10^6$. 解的组数,应模$1e9+7$. 输入输出格 ...
- bzoj2721 / P1445 [Violet]樱花
P1445 [Violet]樱花 显然$x,y>n$ 那么我们可以设$a=n!,y=a+t(t>0)$ 再对原式通分一下$a(a+t)+ax=x(a+t)$ $a^{2}+at+ax=ax ...
- 洛谷P1445 [Violet] 樱花 (数学)
洛谷P1445 [Violet] 樱花 题目背景 我很愤怒 题目描述 求方程 1/X+1/Y=1/(N!) 的正整数解的组数,其中N≤10^6. 解的组数,应模1e9+7. 输入输出格式 输入格式: ...
- Luogu P1445[Violet]樱花/P4167 [Violet]樱花
Luogu P1445[Violet]樱花/P4167 [Violet]樱花 真·双倍经验 化简原式: $$\frac{1}{x}+\frac{1}{y}=\frac{1}{n!}$$ $$\frac ...
- luoguP1445 [Violet]樱花
链接P1445 [Violet]樱花 求方程 \(\frac {1}{X}+\frac {1}{Y}=\frac {1}{N!}\) 的正整数解的组数,其中\(N≤10^6\),模\(10^9+7\) ...
- bzoj 2721[Violet 5]樱花 数论
[Violet 5]樱花 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 671 Solved: 395[Submit][Status][Discuss ...
- 【bzoj2721】[Violet 5]樱花 数论
题目描述 输入 输出 样例输入 2 样例输出 3 题解 数论 设1/x+1/y=1/m,那么xm+ym=xy,所以xy-xm-ym+m^2=m^2,所以(x-m)(y-m)=m^2. 所以解的数量就是 ...
随机推荐
- 第六节 事务XML方式[声明方式]
事务管理: 管理事务,管理数据,数据完整性和一致性 事务[业务逻辑] : 由一系列的动作[查询书价格,更新库存,更新余额],组成一个单元[买书业务], 当我们动作当中有一个错了,全错~ ACID 原子 ...
- json字符串和Json对象,以及json的基本了解
考虑到python等语言中没有更好表示json对象的方法,所以使用JavaScript来介绍json 首先是json字符串: var str1 = '{ "name": " ...
- Spark记录-Scala shell命令
1.scala shell命令 scala> :help All commands can be abbreviated, e.g., :he instead of :help. :edit & ...
- SCI写作经典替换词
- 记webpack下提取公共js代码的方法
环境: webpack4.6 + html-webpack-plugin 多页面多入口 经多次研究,稍微靠谱可用的配置 optimization: { splitChunks: { minSize: ...
- python中open函数的用法
用法如下: name = open('errname.txt','w')name.readline()name.close() 1.看下第一行的代码 用来访问磁盘中存放的文件,可以进行读写等操作,例如 ...
- Spring:@Cacheable 中condition条件的理解
condition=false时,不读取缓存,直接执行方法体,并返回结果,同时返回结果也不放入缓存. ndition=true时,读取缓存,有缓存则直接返回.无则执行方法体,同时返回结果放入缓存(如果 ...
- Ubuntu+Nginx+uWSGI+Flask应用
Ubuntu 18.04,Nginx 1.14.0,uWSGI 2.0.17.1,Flask 1.0.2,Python 3.6.5, 多日未更新博客,就是在忙着把自己的Flask应用在Ubuntu上运 ...
- pom配置之:<distributionManagement>snapshot快照库和release发布库
本文转载自: 铁木箱子的mzone的博客: http://www.mzone.cc/article/277.html http://www.mzone.cc/article/279.html 在使用 ...
- 360加固保的dex脱壳方法
完全测试了看雪论坛的方法,发现并没有脱壳,依然无法反编译 http://bbs.pediy.com/thread-213377.htm 使用上面方法的结果是会得到16个dex文件,只有一个是与程序相关 ...