luoguP1445 [Violet]樱花

链接P1445 [Violet]樱花

  • 求方程 \(\frac {1}{X}+\frac {1}{Y}=\frac {1}{N!}\) 的正整数解的组数,其中\(N≤10^6\),模\(10^9+7\)
  • 化简单一下$$xy-n!(x+y)=0$$
  • 因式分解一下$$(x-n!)*(y-n!)=(n!)^2$$
  • \(a=x-n!,b=y-n!\),那么\(a*b=(n!)^2\)
  • 也就是\(a,b\)对应了唯一一组\(x,y\),所以问题转化成了:求方程 \(a*b=(n!)^2\) 的正整数解的组数。
  • 考虑唯一分解定理,$$(n!)^2=\prod p_i^{2*c_i}$$
  • 所以线性筛后分解\(n!\),答案就是\(\prod (2*c_i+1)\)
#include<bits/stdc++.h>
#define R register int
#define ll long long 
using namespace std;
const int mod=1e9+7;
const int N=1000001;
int n,tot,ans,c[N],Mark[N],prm[N];
int gi(){
    R x=0,k=1;char c=getchar();
    while((c<'0'||c>'9')&&c!='-')c=getchar();
    if(c=='-')k=-1,c=getchar();
    while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+c-'0',c=getchar();
    return x*k;
}
int main(){
	n=gi(),ans=1;
	for(R i=2;i<=n;++i){
		if(!Mark[i])prm[++tot]=i;
		for(R j=1;j<=tot&&prm[j]*i<=n;++j){
			Mark[prm[j]*i]=1;
			if(i%prm[j]==0)break;
		}
	}
	for(R p=1;p<=tot;++p){
		R i=prm[p];
		for(R j=i;j<=n;j+=i){
			R x=j;
			while(x%i==0)c[i]++,x/=i;
		}
	}
	for(R i=1;i<=n;++i)c[i]=(c[i]<<1)+1;
	for(R i=1;i<=n;++i)ans=1ll*ans*c[i]%mod;
	cout<<ans<<endl;
    return 0;
}

posted @ 2018-11-06 19:27  Tyher  阅读(158)  评论(0编辑  收藏  举报