P1445 [Violet]樱花
题目背景
我很愤怒
题目描述
求方程 1/X+1/Y=1/(N!) 的正整数解的组数,其中N≤10^6。
解的组数,应模1e9+7。
输入格式:
输入一个整数N
输出格式:
输出答案
输入样例:
1439
输出样例:
102426508
题解:
由
于
1
x
+
1
y
=
1
n
!
且
x
,
y
都
是
正
整
数
由于\frac 1x +\frac 1y = \frac 1{n!} 且x,y都是正整数
由于x1+y1=n!1且x,y都是正整数
所 以 x , y > n ! 我 们 设 y = n ! + k 所以 x,y >n!\ \ \ \ 我们设y=n!+k 所以x,y>n! 我们设y=n!+k
则 1 x + 1 n ! + k = 1 n ! 则\frac1x+\frac1{n!+k}=\frac1{n!} 则x1+n!+k1=n!1
x + n ! + k x ∗ ( n ! + k ) = 1 n ! \frac{x+n!+k}{x*(n!+k)}=\frac1{n!} x∗(n!+k)x+n!+k=n!1
x ∗ ( n ! + k ) = n ! ∗ ( x + n ! + k ) x*(n!+k)=n!*(x+n!+k) x∗(n!+k)=n!∗(x+n!+k)
x ∗ k = ( n ! ) 2 + k ∗ n ! x*k=(n!)^2+k*n! x∗k=(n!)2+k∗n!
x = ( n ! ) 2 k + n ! x=\frac{(n!)^2}k+n! x=k(n!)2+n!
因 为 x 为 正 整 数 , 所 以 k 定 为 ( n ! ) 2 的 约 数 因为x为正整数,所以k定为(n!)^2的约数 因为x为正整数,所以k定为(n!)2的约数
同 时 , 对 于 每 一 个 ( n ! ) 2 的 约 数 a , 都 能 求 出 一 对 符 合 条 件 的 x , y 同时,对于每一个(n!)^2的约数a,都能求出一对符合条件的x,y 同时,对于每一个(n!)2的约数a,都能求出一对符合条件的x,y
质 因 数 拆 分 来 求 约 数 个 数 。 质因数拆分来求约数个数。 质因数拆分来求约数个数。
代码
#include<bits/stdc++.h>
using namespace std;
const int tt=1e9+7,maxn=1e6+5;
typedef long long LL;
int n,vis[maxn],p[maxn];
void count(int p,int &k)
{
int m=n;k=0;
while (m) k+=m/=p;
}
int main()
{
scanf("%d",&n);
for (int i=2;i<=n;++i)
{
if (!vis[i]) p[++p[0]]=i;int ed=n/i;
for (int j=1;j<=p[0]&&p[j]<=ed;++j)
{
vis[p[j]*i]=1;
if (i%p[j]==0) break;
}
}
int k;LL ans=1;
for (int i=1;i<=p[0];++i)
{
count(p[i],k);k=k<<1|1;
if ((ans*=k)>=tt) ans%=tt;
}
printf("%lld",ans);
return 0;
}