luogu1445 樱花

樱花

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,nZ+
我们先来对式子处理一下。可变为:
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(xn!)=n!x
还可以变 :
y = n ! x x − n ! y=\frac{n!x}{x-n!} y=xn!n!x
但是这样看不出来什么,我们可以再化简,除去分子上的 x x x ,可得:
y = n ! + ( n ! ) 2 x − n ! y=n!+\frac{(n!)^2}{x-n!} y=n!+xn!(n!)2
如果要有正整数解,那么需要满足:
{ x − n ! > 0 x − n ! ∣ ( n ! ) 2 \begin{cases}x-n!>0\\x-n!\mid (n!)^2\end{cases} {xn!>0xn!(n!)2
如果我们求得满足上面式子 x − n ! x-n! xn! 的个数,那么我们就求得了 x x x 的个数,我们也就求得了 ( x , y ) (x,y) (x,y) 正整数解的个数。
我们又知道 x − n ! ∣ ( n ! ) 2 x-n!\mid (n!)^2 xn!(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=1kpici 即可。

代码

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值