51nod1434 区间LCM

跟容斥没有关系。首先可以确定的一个结论是:对于任意正整数,有1*2*...*n | (k+1)*(k+2)*...*(k+n)。因为这就是$C_{n+k}^{k}$。

于是这题就有:m最多枚举到2n。

于是有一个做法:对n!分解质因数,然后枚举m的同时统计已获得的所有质因数的次幂,全部不小于n!时即可推出。

复杂度肯定不大于$O(n\log n)$。

同时这里有一个不会证的结论:找到n以内最大的$p^k$的数(p是质数),答案就是$2p^k$。

$O(n\log n)$

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #define rep(i,l,r) for (int i=(l); i<=(r); i++)
 6 typedef long long ll;
 7 using namespace std;
 8 
 9 const int N=2000010;
10 int T,n,tot,cnt[N],cnt2[N],pr[N],b[N],id[N];
11 
12 void init(int n){
13     rep(i,2,n){
14         if (!b[i]) pr[++tot]=i,id[i]=tot;
15         for (int j=1; j<=tot && pr[j]*i<=n; j++){
16             b[pr[j]*i]=1;
17             if (i%pr[j]==0) break;
18         }
19     }
20 }
21 
22 int main(){
23     init(1000000);
24     for (scanf("%d",&T); T--; ){
25         scanf("%d",&n); int g=1;
26         for (int i=1; i<=tot && pr[i]<=n; i++)
27             for (int j=pr[i]; j<=n; j*=pr[i]) g=max(g,j);
28         printf("%d\n",g*2);
29     }
30     return 0;
31 }
51nod1434

相关文章:

  • 2022-12-23
  • 2021-10-06
  • 2021-07-02
  • 2021-11-07
  • 2022-12-23
  • 2022-12-23
  • 2021-07-06
  • 2021-07-09
猜你喜欢
  • 2021-07-23
  • 2022-02-10
  • 2022-03-05
  • 2021-08-30
  • 2021-11-01
  • 2022-02-15
  • 2021-10-22
相关资源
相似解决方案