luogu1445[Violet]樱花

樱花

link

不要看原题面,不然你会被情侣虐成狗。看我的简述就行。

题面

人话 :
求方程 \(\frac{1}{x}+\frac{1}{y}=\frac{1}{n!}\) 的正整数解,答案对 \(10^9+7\) 取模。其中 \(n\in[1,10^6]\)

做法

注:以下所有 \(x,y,n\in Z^+\)
我们先来对式子处理一下。可变为:

\[n!(x+y)=xy \]

但我们又知道 求得 \(x,y\) 其中之一就可以求出这一组正整数解,所以我们可以用函数的形式来表示出来:

\[y(x-n!)=n!x \]

还可以变 :

\[y=\frac{n!x}{x-n!} \]

但是这样看不出来什么,我们可以再化简,除去分子上的 \(x\) ,可得:

\[y=n!+\frac{(n!)^2}{x-n!} \]

如果要有正整数解,那么需要满足:

\[\begin{cases}x-n!>0\\x-n!\mid (n!)^2\end{cases} \]

如果我们求得满足上面式子 \(x-n!\) 的个数,那么我们就求得了 \(x\) 的个数,我们也就求得了 \((x,y)\) 正整数解的个数。
我们又知道 \(x-n!\mid (n!)^2\) 所以说我们就是要求 \((n!)^2\) 的约数个数,直接套公式即可:
\(c\)\((n!)^2\) 的约数个数,满足:\((n!)^2=\sum\limits_{i=1}^{k}{{p_i}^{c_i}}\) 即可。

代码

#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、付费专栏及课程。

余额充值