一道数学题
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; }
以上是关于一道数学题的主要内容,如果未能解决你的问题,请参考以下文章