• [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++

  • 相关阅读:
    BZOJ 1412: [ZJOI2009]狼和羊的故事
    Bzoj 2443: [Usaco2011 Open]奇数度数
    Bzoj 1101: [POI2007]Zap
    BZOJ 2186: [Sdoi2008]沙拉公主的困惑
    BZOJ 4804: 欧拉心算 欧拉函数
    Luogu P3121 [USACO15FEB]审查(黄金)Censoring (Gold)
    Luogu P3000 [USACO10DEC]牛的健美操Cow Calisthenics
    BZOJ 2060: [Usaco2010 Nov]Visiting Cows 拜访奶牛
    BZOJ 3297: [USACO2011 Open]forgot
    BZOJ 2456: mode
  • 原文地址:https://www.cnblogs.com/wzc521/p/11767188.html
Copyright © 2020-2023  润新知