問題 D: 病毒-----------------------思維(數論)

題目描述
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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章