分析 运用
g
c
d
gcd
gcd的性质:
a
=
p
1
a
1
∗
p
2
a
2
.
.
.
p
k
a
k
a = p_1^{a_1}*p_2^{a_2}...p_k^{a_k}
a=p1a1∗p2a2...pkak
b
=
p
1
b
1
∗
p
2
b
2
.
.
.
p
k
b
k
b = p_1^{b_1}*p_2^{b_2}...p_k^{b_k}
b=p1b1∗p2b2...pkbk
l
c
m
(
a
,
b
)
=
p
1
m
a
x
(
a
1
,
b
1
)
∗
p
2
m
a
x
(
a
2
,
b
2
)
.
.
.
p
k
m
a
x
(
a
k
,
b
k
)
lcm(a,b) = p_1 ^ {max(a_1,b_1)}*p_2^{max(a_2,b_2)}...p_k^{max(a_k,b_k)}
lcm(a,b)=p1max(a1,b1)∗p2max(a2,b2)...pkmax(ak,bk) 推广到
n
n
n个数 本题就是对
1
∼
n
1{\sim}n
1∼n求最小公倍数。那么我们考虑对于每个
p
p
p最大会有多少个,分析可知对于
n
n
n越大,
p
p
p的
c
c
c就会越大,所以就可以直接考虑等于
n
n
n的情况,看小于
n
n
n的质数,对于每一个质数分别最多会有多少个,最后把这些数累加起来就可以了。
代码
/*
独立思考
一个题不会做,收获5%,写了代码10%,提交对了30%,总结吃透了这个题才是100%.
*/#include<bits/stdc++.h>usingnamespace std;template<typename T>voidread(T &x){
x =0;char c =getchar();int sgn =1;while(c <'0'|| c >'9'){if(c =='-')sgn =-1; c =getchar();}while(c >='0'&& c <='9')x = x *10+ c -'0', c =getchar();
x *= sgn;}template<typename T>voidout(T x){if(x <0){putchar('-'); x =-x;}if(x >=10)out(x /10);putchar(x %10+'0');}typedeflonglong ll;typedefunsignedlonglong ull;
ll gcd(ll a, ll b){return b ?gcd(b, a % b): a;}constint N =1e8+5;const ll mod =100000007;
bitset<N> v;int prime[7000005];
ll ans =1;int tot =0;int n;voidsieve(){
v[0]= v[1]=1;for(registerint i =2; i <= n; i++){if(!v[i]){
prime[++tot]= i;for(register ll k = i; k <= n; k *= i)//求对于每一个质数p最多有多少个。{
ans = ans *1ll* i % mod;}}for(registerint j =1; j <= tot && i * prime[j]<= N; j++){
v[i * prime[j]]=1;if(i % prime[j]==0)break;}}}int main (){
cin >> n;sieve();
cout << ans << endl;return0;}