洛谷P1445 [Violet]樱花

@Pelom  October 12, 2021

题意:

求不定方程:
$$\frac{1}{x}+\frac{1}{y}=\frac{1}{n!}$$
的正整数解 $(x,y)$ 的数目。

数据范围: $1\le n\le 10^6$

题解:

对不定方程变形:
$$(x-n!)(y-n!)=(n!)^2$$
设 $a=(x-n!),b=(y-n!)$ ,则:
$$ab=(n!)^2$$
算术基本定理得:
$$n!=\prod p_i^{a_i}$$
所以:
$$ab=\prod p_i^{2a_i}$$
因为 $x$ 与 $a$ , $y$ 与 $b$ 一一对应,且 $x,y$ 成对出现,所以只需要确定 $a$ 便可以确定一个解。而 $a$ 为 $n!$ 的因式,共有 $\prod (2a_i+1)$ 个。答案即为 $a$ 的个数。

代码:

#include<iostream>
#include<cstdio>
#include<memory.h>
using namespace std;
#define int long long
const int N=1e6+10;
const int mod=1e9+7;
int n;
int cnt,ans=1;
bool isP[N];
int pri[N],a[N];
inline void siftPrime(){
    memset(isP,1,sizeof(isP));
    for(int i=2;i<=n;i++){
        if(isP[i])
            pri[++cnt]=i;
        for(int j=1;j<=cnt && i*pri[j]<=n;j++){
            isP[i*pri[j]]=0;
            if(i%pri[j]==0)
                break;
        }
    }
}
signed main(){
    scanf("%lld",&n);
    siftPrime();
    for(int i=1;i<=cnt;i++)
        for(int j=pri[i];j<=n;j*=pri[i])
            (a[i]+=n/j)%=mod;
    for(int i=1;i<=cnt;i++)
        (ans*=(a[i]*2+1))%=mod;
    printf("%lld",ans);
    return 0;
}

添加新评论