题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5407
题目大意:给出一个整数n,我们想知道LCM[ C(n,0),C(n,1),...,C(n,n) ]%mod的值。
分析:对于函数a(n)=LCM[ C(n,0),C(n,1),...,C(n,n) ]和函数b(n)=LCM[ 1,2,3,...,n ],我们有a(n)=b(n)/(n+1)
其中,对于b(n),我们有:b(n)=p*b(n-1)当p是素数且n=p^k时;b(n)=b(n-1)其他情况;证明过程链接
实现代码如下:
#include <cstdio> using namespace std; typedef long long ll; const int maxn=1e6+5; const int mod=1e9+7; ll f[maxn];//打表纪录函数b(n) ll p[maxn];//p[i]纪录i的最大质因子 bool judge(int x) { int d=p[x]; while(x%d==0&&x>1) x/=d; return x==1; } void init() { for(int i=1;i<maxn;i++) p[i]=i; for(int i=2;i<maxn;i++) if(p[i]==i) for(int j=i+i;j<maxn;j+=i) p[j]=i; f[0]=1; for(int i=1;i<maxn;i++) if(judge(i)) f[i]=f[i-1]*p[i]%mod; else f[i]=f[i-1]; } ll quick_mod(ll a,ll n) { ll ans=1; a%=mod; while(n) { if(n&1) ans=(ans*a)%mod; n>>=1; a=(a*a)%mod; } return ans; } ll inverse(ll x) { return quick_mod(x,mod-2); } void solve(int n) { ll ans=f[n+1]*inverse(n+1)%mod; printf("%lld\n",ans); } int main() { init(); int t,n; scanf("%d",&t); while(t--) { scanf("%d",&n); solve(n); } return 0; }