跟容斥没有关系。首先可以确定的一个结论是:对于任意正整数,有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 }