标签:
题目链接:传送门
分析:
1/n! = 1/x +1/y
==> n! * (x + y) = x * y
==> n!^2 = (x - n!)*(y - n!)
==> a = b * c ,a = n!^2 ,b = x - n! ,c = y - n!
因此题目就转化成求a的约数的问题了,然后对a进行素
因子分解就可以了,统计的时候记得去重。
代码如下:
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; const int maxn = 1e6+10; const int mod = 1e9+7; typedef long long LL; int prime[maxn],cnt; bool vis[maxn]; void init() { cnt = 0; memset(vis,0,sizeof(vis)); for(int i=2; i<maxn; i++) { if(!vis[i]) { prime[cnt++]=i; for(int j=i+i; j<maxn; j+=i) vis[j]=1; } } } LL calu(int n,int p) { if(n<p) return 0; else return calu(n/p,p) + n/p; } LL quick_mod(LL a,LL b){ LL ans = 1; while(b){ if(b&1) ans=ans*a%mod; b>>=1; a=a*a%mod; } return ans ; } int main() { init(); int n; while(~scanf("%d",&n)) { LL ans = 1; LL m = quick_mod(2LL,(LL)mod-2); for(int i=0; i<cnt&&prime[i]<=n; i++) { LL tmp = (calu(n,prime[i])*2+1)%mod; ans=ans*tmp%mod; } ans = ans*m%mod; ans = (ans+1*m%mod)%mod; printf("%lld\n",ans); } return 0; }
标签:
原文地址:http://blog.csdn.net/bigbigship/article/details/46551559