一道数学题

/*
由于无头大白鹅学长在题解里把这个题略了
我稍微解释一下这道题

1-n乘起来最大就是 n!
下面我们考虑怎么保证他是一个完全平方数

对于每个数 x 我们分解成 x=p1^a1*p2^a2*p3^a3.....
其中pi是质数 (他有个学名叫做 唯一分解定理)

再考虑一个完全平方数有什么性质 
4=2^2  16=2^4   36=2^2*3^2  144=2^4*3^2 
可以看出(也可以自己证出)对于一个完全平方数x
他分解完之后 每个ai都是偶数

好

现在思路明确 把n!分解好 对于ai是奇数的 
我们把那个单独的pi扔掉即可

然后说一下怎么求n!里面有几个pi
如下代码中的Solve函数  ai=n/pi+n/pi^2+n/pi^3+n/pi^4.....
直到pi^x>n 具体怎么证的自行研究 

然后没了 
另外取模的数是1e8+7 不是1e9+7 
另外别忘了开longlong 
 
*/
#include<iostream>
#include<cstdio>
#define maxn 5000010
#define mod 100000007
#define ll long long
using namespace std;
ll n,prime[maxn/10],c[maxn/10],num,ans=1;
bool f[maxn];
void Prime(){
    for(int i=2;i<=n;i++){
        if(f[i]==0)prime[++num]=i;
        for(int j=1;j<=num;j++){
            if(i*prime[j]>maxn-10)break;
            f[i*prime[j]]=1;
            if(i%prime[j]==0)break;
        }
    }
}
void Solve(){
    for(int i=1;i<=num;i++){
        ll P=prime[i];
        if(P>n)break;
        while(n>=P){
            c[i]+=n/P;P*=prime[i];
        }
    }
}
ll Qc(ll a,ll b){
    ll r=1;
    while(b){
        if(b&1)r=r*a%mod;
        b>>=1;a=a*a%mod;
    }
    return r%mod;
}
int main(){
    cin>>n;
    Prime();Solve();
    for(int i=1;i<=num;i++)
        if(c[i]&1)c[i]--;
    for(int i=1;i<=num;i++){
        if(prime[i]>n)break;
        ans=ans*Qc(prime[i],c[i])%mod;
    }
    cout<<ans<<endl;
    return 0;
}
 
原文地址:https://www.cnblogs.com/yanlifneg/p/10088839.html