[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;
}

幸甚至哉,歌以咏志。

原文链接: https://www.cnblogs.com/DarthVictor/p/12742969.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    [CF833A] The Meaningless Game

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/343644

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午2:12
下一篇 2023年3月2日 上午2:13

相关推荐