P1445 [Violet]樱花
看到题目就要开始愉快地推式子
原式 $\frac{1}{x}+\frac{1}{y}=\frac{1}{n!}$
$\rightarrow \frac{x+y}{xy}=\frac{1}{n!} \rightarrow (x+y)n!=xy \rightarrow xy-(x+y)n!=0$
两边同时加上 $(n!)^2$ 得
$xy-(x+y)n!+(n!)^2=(n!)^2\rightarrow (x-n!)(y-n!)=(n!)^2$
设$a=(x-n!),b=(y-n!)$,则原式化为 $ab=(n!)^2$
如果 a 确定了,那么 b 也确定了,那么 x,y 也都确定了
所以就变成了求 a 的取值方案数
设$z=(n!)^2$
运用唯一分解定理把$z$分解成几个质数的乘积
$z=p_1^{k_1}p_2^{k_2}...p_n^{k_n}$
a可以在每个质数中取 0 到 k1 个作为质因子,那么每个质数有 $k_i+1$ 种取法
根据乘法原理,共有 $(k_1+1)(k_2+1)...(k_n+1)$ 种取法
所以答案就是这个
把阶乘分解就只要把 1 到 n 每个数都分解一遍,复杂度O(nlogn)
分解一个数的质因子都会吧..就不讲了
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<iostream>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=1e6+,mo=1e9+;
int n,cnt[N],ans=;//cnt存 (n!)^2 的质因子数量
int pri[N],tot,p[N];//p存每个数最小的质因子
bool not_pri[N];
void pre()
{
not_pri[]=; p[]=;
for(int i=;i<=n;i++)
{
if(!not_pri[i]) { pri[++tot]=i; p[i]=i; }
for(int j=;j<=tot;j++)
{
ll g=pri[j]*i; if(g>n) break;
not_pri[g]=; p[g]=pri[j];
if(!(i%pri[j])) break;
}
}
}
int main()
{
n=read();
pre();
for(int i=;i<=n;i++)
{
int t=i;
while(t!=) cnt[p[t]]++,t/=p[t];//分解质因子
}
for(int i=;i<=tot;i++) ans=1ll*ans*(cnt[pri[i]]*+)%mo;//记得cnt要乘2加1
printf("%d",ans);
return ;
}
P1445 [Violet]樱花的更多相关文章
- 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 ...
- 【题解】洛谷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 ...
- 洛谷 P1445 [Violet]樱花
#include<cstdio> #include<algorithm> #include<cstring> #include<vector> usin ...
- 「BZOJ2721」「LuoguP1445」 [Violet]樱花(数论
题目背景 我很愤怒 题目描述 求方程 $\frac{1}{x}+\frac{1}{y}=\frac{1}{N!}$ 的正整数解的组数,其中$N≤10^6$. 解的组数,应模$1e9+7$. 输入输出格 ...
- luoguP1445 [Violet]樱花
链接P1445 [Violet]樱花 求方程 \(\frac {1}{X}+\frac {1}{Y}=\frac {1}{N!}\) 的正整数解的组数,其中\(N≤10^6\),模\(10^9+7\) ...
- Luogu1445 [Violet]樱花 ---- 数论优化
Luogu1445 [Violet]樱花 一句话题意:(本来就是一句话的) 求方程 $\frac{1}{X} + \frac{1}{Y} = \frac{1}{N!}$ 的正整数解的组数,其中$N \ ...
- 【洛谷 P1445】 [Violet]樱花(唯一分解定理)
做了题还是忍不住要写一发题解,感觉楼下的不易懂啊. 本题解使用latex纯手写精心打造. 题意:求\(\frac{1}{x}+\frac{1}{y}=\frac{1}{n!}\)的正整数解总数. 首先 ...
随机推荐
- javaScript之节点操作
javaScript程序员避免不了要操作页面中的DOM,除了经常使用的: appendChild()向childNodes列表的末尾添加一个节点. insertBefore(),接受两个参数,要插入的 ...
- Android studio导入svn工程
Quick Start——> Check outproject from Version——> Subversion——> ‘+’加号 ——> 输入网址 ——> 注意选择 ...
- 解决列表中增加字典覆盖之前相同key的字典
dic = {} lst = [] # 先声明一个字典和一个列表 dic['name'] = "chenrun" lst.append(dic) print(lst) dic[&q ...
- 我们为什么要在C++中使用虚函数
类中的成员函数分为静态成员函数和非静态成员函数,而非静态成员函数又分为普通函数和虚函数. 至于为什么虚函数必须是非静态成员函数,可以看一下:http://blog.csdn.net/leiming32 ...
- python pip ez_setup.py
#!/usr/bin/env python """Bootstrap setuptools installation To use setuptools in your ...
- Windows系统 安装 Qt 5.7.0
Windows系统 安装 Qt 5.7.0 我们的电脑系统:Windows 10 64位 Qt5 软件:Qt 5. 7. 0 下载 Qt 5.7.0 软件 在这个网站里面,下载:Qt 5.7.0 fo ...
- Luogu 1484 种树
Luogu 1792 算是双倍经验. 我们考虑对于一个点,我们要么选它,要么选它周围的两个点. 所以我们考虑用一个堆来维护,每次从堆顶取出最大值之后我们把它的权值记为:它左边的权值加上它右边的权值减去 ...
- clions的使用
最近无聊玩了下CLion这个IDE,顺便学习了下CMAKE怎么使用.话说CLion的CMAKE的支持还不是特别的完好,和命令行模式还有有区别,有如下几个问题: 1:CMAKE的编译目录不能指定,而是I ...
- 5.移动渗透测试工具之drozer
本篇博文主要来介绍drozer在移动渗透中的作用 本次实验环境所用工具为:夜神模拟器,drozer-2.3.4,sieve.apk,adb drozer安装这里不再多嘴,给出链接:https://ww ...
- STL--C++中 destory() 和deallocate()以及delete函数的相关性和区别性,destorydeallocate
这里非常的绕口 需要仔细的来看看: destory(): 显示调用一个对象的析构函数 相当于释放一个对象需要释放的一些动态内存 为下次真正释放对象做准备 deallocate():真正的释放一个内存 ...