描述
一天,szb 在上学的路上遇到了灰太狼。
灰太狼:帮我们做出这道题就放了你。
szb:什么题?
灰太狼:求一个能被 [1,n]内所有数整除的最小数字,并对 100000007 取模。
szb:这题太水了,就让我小弟来做好了。
然后你就光荣的接受了这个任务。
输入
一行一个数 n。
输出
一行一个数 ans。
输入样例 1
10
输出样例 1
2520
提示
n≤10^8
题解:求756,4400,19845,9000的最小公倍数?
因756=2×2×3×3×3×7,4400=2×2×2×2×5×5×11,19845=3×3×3×3×5×7×7,9000=2×2×2×3×3×5×5×5,这里有素数2,3,5,7,11.2最高为4次方16,3最高为4次方81,5最高为3次方125,7最高为2次方49,还有素数11.所以得最小公倍数为16811254911=87318000.
解法:“线性筛” 1 ~ 1e8 的素数,找出每个素数对应的最高次幂,最小公倍数=每个素数最高次幂的连乘。
下面附上AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll mod=100000007;
const int M=100000000;
bool a[M+5];
int b[7000005];
int p=0,n;
ll ans=1;
void fun()
{
a[0]=a[1]=1;
for(register int i=2; i<=n; i++)
{
if(!a[i])
{
b[p++]=i;
for(ll k=i; k<=n; k*=i)
{
ans=ans*1ll*i%mod; (1ll为1long long,将整型转换成字符型)
}
}
for(register int j=0; j<p&&i*b[j]<=M; j++)
{
a[i*b[j]]=1;
if(i%b[j]==0)
break;
}
}
}
int main()
{
cin>>n;
fun();
cout<<ans<<endl;
return 0;
}
或者为:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 100000004;
const int mod = 1e8+7;
int n, cnt, p[6200000];
bool vis[maxn];
int main(void)
{
cin>>n;
ll ans = 1;
for(int i = 2; i <= n; i++)
{
if(!vis[i])
{
p[cnt++] = i;
for(ll s = i; s <= n; s *= i)
ans = ans*i%mod;
}
for(int j = 0; j < cnt; j++)
{
ll v = i*p[j];
if(v > n) break;
vis[v] = 1;
if(i%p[j] == 0) break;
}
}
cout<<ans<<endl;
return 0;
}
希望对你有所帮助!