題目傳送門(內部題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++