一道数学题

Posted 一入OI深似海

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一道数学题相关的知识,希望对你有一定的参考价值。

/*
由于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;
}
 

 

以上是关于一道数学题的主要内容,如果未能解决你的问题,请参考以下文章

一道数学恶心题——小凯的疑惑

一道奇怪的数学题

[摸鱼]一道数学题

刘教链比特币原理4-3 一道猜数字的数学题

科普有趣“小学”数学题,做出一道即可成名(持续补充)

科普有趣“小学”数学题,做出一道即可成名(持续补充)