题目传送门(内部题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++