[CSP-S模拟测试]:凉宫春日的忧郁(乱搞)

题目传送门(内部题101)


输入格式

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


输出格式

  输出共有$T$行,对于每一组数据,如果$X^Yleqslant 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\%$的数据,满足$Xleqslant 8,Yleqslant 10$。
  对于$80\%$的数据,满足$X,Yleqslant 300$。
  对于$100\%$的数据,满足$X,Yleqslant 10^5,Tleqslant 5$。


题解

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

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

于是我们可以暴力做比。

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

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

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

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

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

时间复杂度:$Theta(T imes 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++

原文地址:https://www.cnblogs.com/wzc521/p/11767188.html