这道题别看是1e5的范围,看起来用两个for循环会超时,但是在n/i*j<j的情况下,break,就会大大减少时间复杂度,还有一个比较坑的点,在代码里有提到
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#include <sstream>
#include <map>
#include <set>
#include <queue>
#include <stdlib.h>
typedef long long ll;
using namespace std;
int a[100000];
int main()
{
for (int i=1;i<=10000;i++)
{
a[i]=i;
}
int T;
cin >> T;
while(T--)
{
int n;
cin >> n; //输入要拆分的数
int flag=0,x=0,y=0;
int min1=n; //记录c-a的最小值
for(int i=2;i<=n;i++) //i代表的是a
{
for(int j=2;j<=n;j++) //j代表的是b
//这里j要从2开始算,如果从i开始算,当i=100000,则j=100000,那么i*j会爆int,所以要从2开始算,没爆int之前就会break,当然这里直接用long long算也可以。如果从i开始,又没用long long,会发生浮点错误
{
if((n%(i*j))==0 && n/(i*j)>=j && i<=j)
{
int h=n/(i*j); //h代表的是c
flag=1;
if(h-i<=min1) //如果c-a的值可以更新,记录下a,b的值(已知a,b的值,就可以推出c的值)
{
x=i;
y=j;
min1=h-i;
}
}
if((n/(i*j))<j) break; //减少时间复杂度,一但这种情况发生,当前i下面的j也不用遍历了,直接进入下一个i
}
}
if(flag==1) printf("%d=%d*%d*%d\n",n,x,y,n/(x*y));
else printf("No solution\n");
}
return 0;
}



京公网安备 11010502036488号