1 条题解

  • 0
    @ 2023-3-26 13:18:27

    樱花

    link

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

    题面

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

    做法

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

    n!(x+y)=xyn!(x+y)=xy

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

    y(xn!)=n!xy(x-n!)=n!x

    还可以变 :

    y=n!xxn!y=\frac{n!x}{x-n!}

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

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

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

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

    如果我们求得满足上面式子 xn!x-n! 的个数,那么我们就求得了 xx 的个数,我们也就求得了 (x,y)(x,y) 正整数解的个数。
    我们又知道 xn!(n!)2x-n!\mid (n!)^2 所以说我们就是要求 (n!)2(n!)^2 的约数个数,直接套公式即可:
    cc(n!)2(n!)^2 的约数个数,满足:
    (n!)2=i=1kpici(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;
    }
    
    • 1

    信息

    ID
    445
    时间
    1000ms
    内存
    125MiB
    难度
    5
    标签
    递交数
    7
    已通过
    3
    上传者