bzoj2721: [Violet 5]樱花
本来以为这题比较难的。。。
推下柿子
1/x+1/y=1/n!
(x+y)*n!=xy
设y=n!+d
(x+n!+d)*n!=x(n!+d)
n!^2+d*n!=x*d
(n!^2+d*n!)/d=x 只要令n!^2/d是整数就行了
那么就是算n!的约数个数
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; typedef long long LL; const LL mod=1e9+7; int pr,prime[1100000]; bool v[1100000]; void getprime(int n) { pr=0; memset(v,true,sizeof(v)); for(int i=2;i<=n;i++) { if(v[i]==true)prime[++pr]=i; for(int j=1;j<=pr&&i*prime[j]<=n;j++) { v[i*prime[j]]=false; if(i%prime[j]==0)break; } } } int main() { int n; scanf("%d",&n); getprime(n); LL ans=1; for(int i=1;i<=pr;i++) { LL c=0; for(LL j=prime[i];j<=n;j*=prime[i]) c=(c+n/j)%mod; ans=(ans*(c*2+1))%mod; } printf("%lld\n",ans); return 0; }
pain and happy in the cruel world.