【题解】洛谷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;
}