題目描述
chen_03 會製造電腦病毒。
有人把 Jay 的電腦植入了病毒,而要解除病毒,Jay 要回答一道題。
在電腦屏幕上有一個數n ,Jay 被要求輸入一個正整數,這個數能被[1,n]內所有數整除,並且要保持這個數最小,因爲這個數可能很大,所以只要輸出對109+7取模的結果就行了。
然而 Jay 成功的破解了病毒,並將病毒植入了你的電腦上。
然後你就不得不開始解這道題。
輸入
輸入一個正整數n。
輸出
輸出一個正整數表示答案。
樣例輸入 Copy
10
樣例輸出 Copy
2520
提示
解析:
[1,n]中的數都能被n整除,那麼裏面的合數都可以由質數分解 成 xa
根據這個定理,我們只要找出[1,n]的質數,然後枚舉質數個數即可
比如: n=10,裏面的質數有2,3,5,7
10可以分解出 3個2 23
10可以分解出 2個3 32
10可以分解出 1個5 5
10可以分解出 1個7 7
那麼23 * 32 * 5 * 7 =2520
所以答案就是所有的xa相乘
#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e8+100000;
const int MOD=1e9+7;
bool is_prime[N];
ll prime[5777777],cnt;
ll n;
void init(ll n)
{
for(int i=2;i<=n;i++)
{
if(!is_prime[i]) prime[++cnt]=i;
for(int j=1;j<=cnt&&prime[j]<=n/i;j++)
{
is_prime[i*prime[j]]=true;
if(i%prime[j]==0) break;
}
}
}
int main()
{
scanf("%lld",&n);init(n);
ll sum=1;
ll res;
for(int i=1;i<=cnt;i++)
{
res=n;
while(res/prime[i]!=0) sum=(sum*prime[i])%MOD,res/=prime[i];
}
printf("%lld\n",sum%MOD);
}