思路:
找规律的时候发现最大的不超过2*最大的n。但是之后发现n=6时候m=10。
如果枚举1~5可以发现 2-2 3-3 4--2,2 5-5 6-2,3
那么必定是从5这个位置上决定的。因为6的2,3可以被2,3求最大公约数时合并到一起。
那么在求结果的时候,我们需要找到的东西就是无法被合并到一起的最大因子。而因子已经都已经被我们拆分为了素数。因此找最大的素数的幂就好了
#include <stdio.h>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int maxn=1000005;
int prime[maxn],vis[maxn];
int cnt=0;
void init()
{
for(int i=2; i<maxn; i++)
{
if(!vis[i])
{
prime[++cnt]=i;
}
for(int j=i; j<maxn; j+=i)
{
vis[j]=1;
}
}
}
int main()
{
int t;
init();
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
int maxx=1;
int index=1;
for(int i=1; i<=cnt&&prime[i]<=n; i++)
{
int res=1;
int tmp=n;
while(tmp >=prime[i])
{
res*=prime[i];
tmp/=prime[i];
}
if(maxx<res)
{
maxx=res;
index=prime[i];
}
}
printf("%d\n",maxx*2);
}
}