一道數學題

/*
因爲longlong學長在題解裏把這個題略了
我稍微解釋一下這道題

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;
}
 
相關文章
相關標籤/搜索