洛谷P1445 [Violet] 樱花

题目背景

我很愤怒

题目描述

求方程 1/X+1/Y=1/(N!) 的正整数解的组数,其中N≤10^6。

解的组数,应模1e9+7。

输入输出格式

输入格式:

输入一个整数N

输出格式:

输出答案

输入输出样例

输入样例#1:

1439

输出样例#1:

102426508

Solution

极其恶心的一道题...

看到这种题肯定是需要化简式子的,因为出题人不会好到给你一个好做的式子

\[\frac{1}{x}+\frac{1}{y}=\frac{1}{n!}
\]

\[\frac{x+y}{xy}=\frac{1}{n!}
\]

\[xy=(n!)\times (x+y)
\]

一个骚操作,两边同时加上\((n!)^2\),为什么,因为方便因式分解...

\[(n!)^2-(n!)\times (x+y)+xy=(n!)^2
\]

然后因式分解

\[(n!-x)\times (n!-y)=(n!)^2
\]

令\(a=(n!-x),b=(n!-y)\),因为\((n!)^2\)是确定的,所以确定了\(a\),就可以确定\(b\),也就可以确定\(x,y\)了

那么a的方案数是多少?因为\(a\)是\((n!)^2\)的因子,所以\(a\)的取值的方案数就是\((n!)^2\)的因子的方案数

然后根据唯一分解定理

\[n!=p_1^{c_1}\times p_2^{c_2}\times ...\times p_m^{c_m}
\]

\[(n!)^2=p_1^{2\times c_1}\times p_2^{2\times c_2}\times ...\times p_m^{2\times c_m}
\]

由于每个质因子\(p_i\)都有\(2\times c_i+1\)种取值,所以

\[ans=(2\times c_1+1)\times (2\times c_2 +1)\times ...\times(2\times c_m+1)
\]

那么最后问题就转化成了对\(n!\)进行分解质因数,并求质因数的个数

暴力对\(1-n\)每个数分解质因数,再合并复杂度过高,为\(O(n\sqrt n)\)

由于\(n!\)的每个质因子都不超过n,所以我们可以预处理\(1-n\)内所有质数p,再考虑\(n!\)内一共有多少个质因子p

我们可以对于在线性筛质数的过程中同时处理一下n以内每个数的最小质因子\(p\),然后统计这个数的贡献,在\(1-n\)中至少包含一个质因子\(p\)的有\(\lfloor\frac{n}{p}\rfloor\),至少包含两个质因子p的有\(\lfloor\frac{n}{p^2}\rfloor\)...

那么\(n!\)中质因子\(p\)的个数就是

\[\lfloor\frac{n}{p}\rfloor+\lfloor\frac{n}{p^2}\rfloor+...+\lfloor\frac{n}{p^{log_{p}{n}}}\rfloor
\]

对于每个质因子,我们只需要\(log\ n\)的时间来求解,所以总复杂度是\(O(n\ log\ n)\)的

Code

#include<bits/stdc++.h>
#define rg register
#define il inline
#define Min(a,b) ((a)<(b)?(a):(b))
#define Max(a,b) ((a)>(b)?(a):(b))
#define lol long long
#define in(i) (i=read())
using namespace std; const lol N=1e6+10,mod=1e9+7; lol read() {
lol ans=0,f=1; char i=getchar();
while(i<'0' || i>'9') {if(i=='-') f=-1; i=getchar();}
while(i>='0' && i<='9') ans=(ans<<1)+(ans<<3)+i-'0',i=getchar();
return ans*=f;
} lol n,cnt,ans=1;
lol g[N],prime[N],c[N]; void init() {
memset(g,0,sizeof(g));
for(int i=2;i<=n;i++) {
if(!g[i]) g[i]=i,prime[++cnt]=i;
for(int j=1;j<=cnt && i*prime[j]<=n;j++) {
g[i*prime[j]]=prime[j];
if(i%prime[j]==0) break;
}
}
} int main()
{
in(n); init();
for(int i=1;i<=n;i++)
for(int j=i;j!=1;j/=g[j]) c[g[j]]++;
for(int i=1;i<=n;i++) ans=ans*(c[i]*2+1)%mod;
cout<<ans<<endl;
}

洛谷P1445 [Violet] 樱花 (数学)的更多相关文章

  1. 【题解】洛谷P1445 [Violet]樱花 (推导+约数和)

    洛谷P1445:https://www.luogu.org/problemnew/show/P1445 推导过程 1/x+1/y=1/n! 设y=n!+k(k∈N∗) 1/x​+1/(n!+k)​=1 ...

  2. 洛谷 P1445 [Violet]樱花

    #include<cstdio> #include<algorithm> #include<cstring> #include<vector> usin ...

  3. BZOJ2721或洛谷1445 [Violet]樱花

    BZOJ原题链接 洛谷原题链接 其实推导很简单,只不过我太菜了想不到...又双叒叕去看题解 简单写下推导过程. 原方程:\[\dfrac{1}{x} + \dfrac{1}{y} = \dfrac{1 ...

  4. 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 ...

  5. Luogu P1445[Violet]樱花/P4167 [Violet]樱花

    Luogu P1445[Violet]樱花/P4167 [Violet]樱花 真·双倍经验 化简原式: $$\frac{1}{x}+\frac{1}{y}=\frac{1}{n!}$$ $$\frac ...

  6. 洛谷P2398 GCD SUM (数学)

    洛谷P2398 GCD SUM 题目描述 for i=1 to n for j=1 to n sum+=gcd(i,j) 给出n求sum. gcd(x,y)表示x,y的最大公约数. 输入输出格式 输入 ...

  7. 【洛谷 P1445】 [Violet]樱花(唯一分解定理)

    做了题还是忍不住要写一发题解,感觉楼下的不易懂啊. 本题解使用latex纯手写精心打造. 题意:求\(\frac{1}{x}+\frac{1}{y}=\frac{1}{n!}\)的正整数解总数. 首先 ...

  8. 洛谷P1445 樱花

    题意:求 1/x + 1/y = 1/(n!)的正整数解个数. 解:神仙...... 设(n!) = t 打表发现 x ∈ [t+1 , 2t] 反正就是拿到式子以后乱搞一通然后发现得到了这个很美观的 ...

  9. 洛谷 P4169 [Violet]天使玩偶/SJY摆棋子 解题报告

    P4169 [Violet]天使玩偶/SJY摆棋子 题目描述 \(Ayu\)在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,\(Ayu\) 却忘了她把天使玩偶埋在了哪 ...

随机推荐

  1. 《深入分析Java Web技术内幕》读书笔记之JVM内存管理

    今天看JVM的过程中收获颇丰,但一想到这些学习心得将来可能被遗忘,便一阵恐慌,自觉得以后要开始坚持做读书笔记了. 操作系统层面的内存管理 物理内存是一切内存管理的基础,Java中使用的内存和应用程序的 ...

  2. 亚马逊CEO贝索斯致股东信:阐述公司未来计划

    亚马逊CEO 杰夫·贝索斯(Jeff Bezos)今天发布年度股东信, 详细描述了亚马逊的产品.服务和未来计划,当然,信中并没有任何的硬数据,比如说亚马逊Kindle的销量等等.但这封信也包括一些颇令 ...

  3. nginx原声方法按照每天日志切割保存

    首先配置日志变量,然后配置日志 在/etc/nginx/conf.d/default.conf 配置变量 server{ if ($time_iso8601 ~ "^(\d{4})-(\d{ ...

  4. 上午做的第一个安卓app

    刚开始学习安卓开发,有好多不懂,好多快捷键不知道,好多文件也不知道是干什么用的,初学时的确会有很多烦恼,比如哪里又多一个空格也会报错,有时候错误很难看懂. 嘿嘿,一上午的功夫边学习边调代码,做出了我第 ...

  5. 5月5号周二课堂练习:简评cnblogs.com的用户体验

    一.用户类型 在博客园上写博客,提问题,浏览感兴趣的博客帖子的活跃用户. 二.对cnblogs的期望 在博客园上写博客更流畅,制作手机版的APP可以随时随地在线浏览大牛们写的博客,提出的问题能更好的更 ...

  6. Nodejs学习笔记(二)--- 操作MongoDB数据库

    最近看了一些关于mongodb的文章,然后就想知道nodeJS是怎么连接的所以我就尝试去了解了一波(这个菜鸟驿站这个网站还不错,虽然知识文档不是最新的,但是还是蛮好的: 顺便官网地址是这个哦:http ...

  7. 《高性能JavaScript》学习笔记——日更中

    ------------------2016-7-20更------------------ 最近在看<高性能JavaScript>一书,里面当中,有讲很多提高js性能的书,正在看的过程中 ...

  8. maven将依赖打入jar包

    将 依赖打入jar包,由于maven管理了所有的依赖,所以将项目的代码和依赖打成一个包对它来说是顺理成章的功能.maven的这个功能之前就用过,但这 次使用时忘了细节,只记得用maven的assemb ...

  9. ubuntu下安装 openssl&&编译运行测试代码

    检查是否已安装 openssl: sudo apt-get install openssl 如果已安装执行以下操作:sudo apt-get install libssl-devsudo apt-ge ...

  10. 理解promise 02

    1:promise是什么? 就是(链式)包装的回调函数. 2:语法 new Promise( function(resolve, reject) {...} /* executor */ ); exe ...