题目传送门(内部题101)


输入格式

  第一行输入一个整数$T$,表示数据组数。
  接下来$T$行,每行两个数$X,Y$,表示$T$组数据。


输出格式

  输出共有$T$行,对于每一组数据,如果$X^Y\leqslant Y!$,输出$Yes$,否则输出$No$。


样例

样例输入1:

3
1 4
2 4
3 4

样例输出1:

Yes
Yes
No

样例输入2:

5
50 100
37 100
200 1000
400 1000
20000 100000

样例输出2:

No
Yes
Yes
No
Yes


数据范围与提示

  对于$50\%$的数据,满足$X\leqslant 8,Y\leqslant 10$。
  对于$80\%$的数据,满足$X,Y\leqslant 300$。
  对于$100\%$的数据,满足$X,Y\leqslant 10^5,T\leqslant 5$。


题解

好吧,我承认我真的很会(bu)乱(yao)搞(lian)

比较两个数大小的其中一种方法就是做比,如果比值大于$1$,则作为分子的数大。

于是我们可以暴力做比。

直接暴力大家都会,用阶乘作分子即可,但是精度问题无法解决……

问题转化为如何保证精度……

于是我们可以当阶乘大于一个比较大的数时在除掉$X$即可。

事实证明,开$float$也能过(又短又快)。

当然也有其它乱搞方法,比如如果$X\geqslant Y\times 0.4$输出$Yes$,否则为$No$。

时间复杂度:$\Theta(T\times Y)$。

期望得分:$0$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
int X,Y;
int main()
{
int T;scanf("%d",&T);
while(T--)
{
scanf("%d%d",&X,&Y);
if(X==1){puts("Yes");continue;}
float nowy=1;
int sum=0;
for(int i=1;i<=Y;i++)
{
nowy*=i;
while(nowy>1000000000.0)
{
nowy/=X;
sum++;
}
}
while(nowy>X){sum++;nowy/=X;}
if(sum>=Y)puts("Yes");
else puts("No");
}
return 0;
}

rp++

05-08 14:59