【题解】洛谷P1445 [Violet]樱花

\(Description:\)

求满足\(\frac{1}{x}+\frac{1}{y}=\frac{1}{n!}\)的x,y的个数,答案对1e9+7取模。

\(Sample\) \(Input:\)

1439

\(Sample\) \(Output:\)

102426508

一开始发现这题好像无从下手,决定先化简式子:

\(\frac{x+y}{xy}=\frac{1}{n!}\)

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

\(-(n!)(x+y)+xy=0\)

考虑要对他因式分解,所以加上一项\((n!)^2\)

\((n!)^2-(n!)(x+y)+xy=(n!)^2\)

左边十字相乘分解:

\((n!-x)*(n!-y)=(n!)^2\)

\(a=(n!-x)\),\(b=(n!-y)\)

那么\(ab=(n!)^2\)

发现其实要求的就是a和b的有几对。

那么只要知道\((n!)^2\)因数的个数就知道答案了。

但发现这个数据范围达到了1e6......

考。。。这怎么办。

考虑:

\((n!)=p_1 ^{c_1}*p_2^{c_2}......\)

那么

\((n!)^2=p_1 ^ {2c_1}*p_2 ^{2c_2}......\)

因为我们要求的是因数个数,又不方便\(o(\sqrt {n!^2})\)枚举,那么考虑一个结论:

对于一个数n,他的因数个数为:\((1+c_1)(1+c_2)......\)

为什么这是正确的,

因为对于每一个质因数需要考虑它取0个,1个,2个......

那么根据乘法原理就是把他们乘一乘。

再考虑质因数

那么考虑\((n!)=(n!)^2\)的质因数相同,只是质因数次数不一样

那就很方便了。因为n!的质因数就是小于等于n的质数。

那只要筛一遍所有质数,再枚举每一个\(i(i<=n)\),把它不断除去他的质因数取出c,

最后再把他们按照结论算出因数个数。

要不要看代码啊?

#include<bits/stdc++.h>
using namespace std;
int n,ans,cnt;
const int MAXN=1e6;
const int P=1e9+7;
int vis[MAXN+5],p[MAXN+5];
int num[MAXN+5],v[MAXN+5];
int main(){
    scanf("%d",&n);
    for(int i=2;i<=n;++i){
        if(!v[i])p[++cnt]=i,vis[i]=i;
        for(int j=1;j<=cnt && i*p[j]<=n;++j){
            v[i*p[j]]=1;
            vis[i*p[j]]=p[j];
            if(i%p[j]==0)break;
        }
    }
    ans=1;
    for(int i=1;i<=n;++i)for(int j=i;j!=1;j/=vis[j])
        num[vis[j]]++;
    for(int i=1;i<=cnt;++i)ans=(1ll*ans*(1+2*num[p[i]])%P)%P;
    printf("%d\n",ans);
    return 0;
}
posted @ 2019-04-01 21:16  章鱼那个哥  阅读(162)  评论(0编辑  收藏  举报