樱花
link
不要看原题面,不然你会被情侣虐成狗。看我的简述就行。
题面
人话 :
求方程 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;
}