【传送门:51nod-1189】
简要题意:
给出一个数n,求出有多少个正整数x,y(0<x<=y)满足$1/n!=1/x+1/y$
题解:
一开始还以为不可做
结果推一下柿子就会了
$1/n!=1/x+1/y$可以转化为$xy=n!*(x+y)$
又可以转化为$xy-n!*(x+y)=0$,得到$xy-n!*(x+y)+n!^2=n!^2$,得到$(x-n!)*(y-n!)=n!^2$
woc,水题
直接将n!质因数分解,然后每个质因数的指数*2(因为是n!的平方),求因数个数就行了
因为要求x<=y,所以将(ans+1)/2,这部分用逆元求即可
参考代码:
#include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> using namespace std; typedef long long LL; LL Mod=1e9+7; int prime[1100000]; int v[1100000],m; void get_p(int n) { memset(v,0,sizeof(v)); m=0; for(int i=2;i<=n;i++) { if(v[i]==0) { prime[++m]=i; v[i]=i; } for(int j=1;j<=m;j++) { if(prime[j]>n/i||prime[j]>v[i]) break; v[i*prime[j]]=prime[j]; } } } LL p_mod(LL a,LL b) { LL ans=1; while(b!=0) { if(b%2==1) ans=ans*a%Mod; a=a*a%Mod;b/=2; } return ans; } int main() { int n; scanf("%d",&n); get_p(n); LL sum=0,ans=1; for(int i=1;i<=m;i++) { LL d=prime[i];sum=0; while(d<=n) { sum=(sum+n/d)%Mod; d*=prime[i]; } sum=(sum*2LL%Mod+1)%Mod; ans=ans*sum%Mod; } ans=(ans+1)%Mod; LL ny=p_mod(2LL,Mod-2); printf("%lld ",ans*ny%Mod); return 0; }