zoukankan      html  css  js  c++  java
  • [CF833A] The Meaningless Game

    题目

    原题链接

    解说

    题目名称起的太好了!

    这道题属于思维/数学题,想明白了真的很简单。

    一个数可以由许多数相乘得到,每个组成它的数就像它的成分一样。给一个数乘(k)就相当于在其组成中增加了(k)。那么我们看看这道题。

    假设两个人分别为(A B),初始均为(1),那么一轮游戏中给(A)(k)就是在其组成中加入(k),同时在(B)的组成中加入两个(k)(AB)合计加入了三个(k)。显然(A×B)就相当于把(AB)混合在了一起,其所有成分都混合在了一起,所以(A×B)中一定含有三个(k)。那么我们只要判断(A×B)是否为完全立方数即可。

    于是我写出了第一代代码:

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    inline ll read(){
        char ch=getchar();
        ll s=0,f=1;
        while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}
        while (ch>='0'&&ch<='9') {s=(s<<3)+(s<<1)+ch-'0';ch=getchar();}
        return s*f;
    }
    int main(){
    	int T;
    	cin>>T;
    	while(T--){
    		ll a,b;
    		a=read();b=read();
    		ll u=a*b;
    		ll m=pow(u,(1.0/3))+0.5;//计算立方根
      		//注意变为整数时+0.5四舍五入
    		if(m*m*m!=u) cout<<"No"<<endl;
    		else cout<<"Yes"<<endl;
    	}
    	return 0;
    }
    

    然后就WA了……

    哪里有问题?哦,我们忽略了一种情况,假如把三个(k)都放到一个数里,那么我的程序会输出(Yes),但事实上这是不符合条件的。我们还需要加一层条件,就是得到的立方根是(AB)两个数的因数。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    inline ll read(){
        char ch=getchar();
        ll s=0,f=1;
        while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}
        while (ch>='0'&&ch<='9') {s=(s<<3)+(s<<1)+ch-'0';ch=getchar();}
        return s*f;
    }
    int main(){
    	int T;
    	cin>>T;
    	while(T--){
    		ll a,b;
    		a=read();b=read();
    		ll u=a*b;
    		ll m=pow(u,(1.0/3))+0.5;
    		if(m*m*m!=u||a%m||b%m) cout<<"No"<<endl;
    		else cout<<"Yes"<<endl;
    	}
    	return 0;
    }
    

    幸甚至哉,歌以咏志。

  • 相关阅读:
    无限维
    黎曼流形
    why we need virtual key word
    TOJ 4119 Split Equally
    TOJ 4003 Next Permutation
    TOJ 4002 Palindrome Generator
    TOJ 2749 Absent Substrings
    TOJ 2641 Gene
    TOJ 2861 Octal Fractions
    TOJ 4394 Rebuild Road
  • 原文地址:https://www.cnblogs.com/DarthVictor/p/12742969.html
Copyright © 2011-2022 走看看