樱花
不要看原题面,不然你会被情侣虐成狗。看我的简述就行。
题面
人话 :
求方程
1
x
+
1
y
=
1
n
!
\frac{1}{x}+\frac{1}{y}=\frac{1}{n!}
x1+y1=n!1 的正整数解,答案对
1
0
9
+
7
10^9+7
109+7 取模。其中
n
∈
[
1
,
1
0
6
]
n\in[1,10^6]
n∈[1,106] 。
做法
注:以下所有
x
,
y
,
n
∈
Z
+
x,y,n\in Z^+
x,y,n∈Z+
我们先来对式子处理一下。可变为:
n
!
(
x
+
y
)
=
x
y
n!(x+y)=xy
n!(x+y)=xy
但我们又知道 求得
x
,
y
x,y
x,y 其中之一就可以求出这一组正整数解,所以我们可以用函数的形式来表示出来:
y
(
x
−
n
!
)
=
n
!
x
y(x-n!)=n!x
y(x−n!)=n!x
还可以变 :
y
=
n
!
x
x
−
n
!
y=\frac{n!x}{x-n!}
y=x−n!n!x
但是这样看不出来什么,我们可以再化简,除去分子上的
x
x
x ,可得:
y
=
n
!
+
(
n
!
)
2
x
−
n
!
y=n!+\frac{(n!)^2}{x-n!}
y=n!+x−n!(n!)2
如果要有正整数解,那么需要满足:
{
x
−
n
!
>
0
x
−
n
!
∣
(
n
!
)
2
\begin{cases}x-n!>0\\x-n!\mid (n!)^2\end{cases}
{x−n!>0x−n!∣(n!)2
如果我们求得满足上面式子
x
−
n
!
x-n!
x−n! 的个数,那么我们就求得了
x
x
x 的个数,我们也就求得了
(
x
,
y
)
(x,y)
(x,y) 正整数解的个数。
我们又知道
x
−
n
!
∣
(
n
!
)
2
x-n!\mid (n!)^2
x−n!∣(n!)2 所以说我们就是要求
(
n
!
)
2
(n!)^2
(n!)2 的约数个数,直接套公式即可:
设
c
c
c 为
(
n
!
)
2
(n!)^2
(n!)2 的约数个数,满足:
(
n
!
)
2
=
∑
i
=
1
k
p
i
c
i
(n!)^2=\sum\limits_{i=1}^{k}{{p_i}^{c_i}}
(n!)2=i=1∑kpici 即可。
代码
#include<cstdio>
typedef long long LL;
#define NUMBER1 1000000
#define P(A) A=-~A
#define fione_i(begin,end) for(register int i=begin;i<=end;P(i))
const LL mod=1e9+7;
int prime[NUMBER1+5],n,cnt(0);
bool pd[NUMBER1+5];
inline void PRIME(){
fione_i(2,n){
if(!pd[i])prime[++cnt]=i;
for(int j=1;prime[j]*i<=n;P(j)){
pd[prime[j]*i]=true;
if(!(i%prime[j]))break;
}
}
}
signed main(){
LL p;
scanf("%d",&n);
PRIME();
LL ans(1);
fione_i(1,cnt){
p=0;
for(int j=n;j;j/=prime[i])p+=j/prime[i];
ans=ans*((p<<1)+1)%mod;
}
printf("%lld",ans);
return 0;
}