首页 > 其他分享 >D. Another Problem About Dividing Numbers

D. Another Problem About Dividing Numbers

时间:2024-08-15 22:27:26浏览次数:6  
标签:About 200005 Dividing int st next low Problem now

原题链接

题意

有两个数 \(a,b\) 每次可以拿走其中一个数的若干个质因子,请问恰好 \(k\) 次操作后能否使 \(a=b\)

分析

假设 \(a,b\) 最后到达的是 \(c\) ,那么 \(\frac{a}{c}\) 的质因子个数加上 \(\frac{b}{c}\) 的质因子个数一定大于等于 \(k\)(为什么可以大于?因为一次操作可以多拿几个质因子)

所以 \(k\) 最大可以取到 \(cnt_a+cnt_b\),其中 \(cnt\) 代表一个数的质因子个数

注意边界:如果 \(k=1\) ,则要求 \(a,b\) 有且仅能有一个,要么 \(a\),要么 \(b\) ,有独属于自己的质因子,换句话说,\(a=kb\) 或 \(b=ka\),其中 \(k\ne 1\)

实施

对于 1e9 的数而言,如何快速求质因子个数呢?

开根

细节

不要开longlong ,会 T

code

#include<bits/stdc++.h>
using namespace std;
/*
mt19937_64 rnd(time(0));
#define double long double
#define lowbit(x) ((x)&(-x))
const int inf=1e18;
const int mod=1e9+7;

const int N=4e5;
int qpow(int a,int n)
{
    int res=1;
    while(n)
    {
        if(n&1) res=res*a%mod;
        a=a*a%mod;
        n>>=1;
    }
    return res;
}
int inv(int x)
{
    return qpow(x,mod-2);
}
int fa[2000005];
int finds(int now) { return now == fa[now] ? now :fa[now]=finds(fa[now]); }

vector<int> G[200005];

int dfn[200005],low[200005];
int cnt=0,num=0;
int in_st[200005]={0};
stack<int> st;
int belong[200005]={0};

void scc(int now,int fa)
{
    dfn[now]=++cnt;
    low[now]=dfn[now];
    in_st[now]=1;
    st.push(now);

    for(auto next:G[now])
    {
        if(next==fa) continue;

        if(!dfn[next])
        {
            scc(next,now);
            low[now]=min(low[now],low[next]);
        }
        else if(in_st[next])
        {
            low[now]=min(low[now],dfn[next]);
        }
    }

    if(low[now]==dfn[now])
    {
        int x;
        num++;
        do
        {
            x=st.top();
            st.pop();
            in_st[x]=0;
            belong[x]=num;
        }while(x!=now);
    }
}
vector<int> prime;
bool mark[200005]={0};
void shai()
{
    for(int i=2;i<=200000;i++)
    {
        if(!mark[i]) prime.push_back(i);

        for(auto it:prime)
        {
            if(it*i>200000) break;

            mark[it*i]=1;
            if(it%i==0) break;
        }
    }
}
*/


void solve()
{
    int a,b,k;
    cin>>a>>b>>k;

    int tema=a,temb=b;
    int cnta=0,cntb=0;
    for(int i=2;i*i<=a;i++)
    {
        while(a%i==0)
        {
            cnta++;
            a/=i;
        }
    }
    if(a!=1) cnta++;

    for(int i=2;i*i<=b;i++)
    {
        while(b%i==0)
        {
            cntb++;
            b/=i;
        }
    }
    if(b!=1) cntb++;

    if(k==1)
    {
        if(tema%temb==0&&tema/temb!=1||temb%tema==0&&temb/tema!=1) cout<<"yes\n";
        else cout<<"no\n";
    }
    else
    {
        if(k<=cnta+cntb) cout<<"yes\n";
        else cout<<"no\n";
    }
}
signed main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int TT=1;
    cin>>TT;
    while(TT--) solve();
    return 0;
}


标签:About,200005,Dividing,int,st,next,low,Problem,now
From: https://www.cnblogs.com/pure4knowledge/p/18361919

相关文章

  • P1001 A+B Problem(整活-dijstra堆优化)
    OK啊,这就是普通的\(a+b\)嘛这是一道十分淼的题目,乍一看,这不就是dijstra堆优化的模板题吗?首先,建立三个节点,两条线行,OK开始Code#include<bits/stdc++.h>usingnamespacestd;constlonglongN=99999,M=999999;typedefpair<longlong,longlong>PII;priority_......
  • Android Studio报错: A problem occurred starting process command ,CreateProcess er
    AndroidStudio报错:Aproblemoccurredstartingprocesscommand,CreateProcesserror=2,系统找不到指定的文件一、遇到问题二、解决问题重新下载了22.0.7026061和22.1.7171670只在cmake.dir中修改了路径(ndk.dir中修改了路径[未尝试])clean+SyncProject,OK了!......
  • Ideas of Problems in Aug. 2024
    \(\text{LuoguP1552[APIO2012]派遣}\)前置芝士:可并堆(左偏树)或斜堆或启发式合并。本题题意概括为:给定一颗以\(1\)为根的树,每个点有权值\(L_i\),花费\(C_i\),可以选择一个以某个结点为根的子树,并从其中选出一个点集\(T\)满足\(\sum_{i\inT}C_i\leqM\),那么此次的价......
  • E - Xor Sigma Problem
    原题链接题解首先,位运算很容易想到按位枚举。而这道题的关键是如何快速求区间异或和。对此,我们构建一个后缀异或数组即可,甚至这个数组可以进一步优化为cnt1和cnt0两个变量。(具体实现看code理解)code #include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;......
  • 洛谷P1480 A/B Problem
    4.高精度除以低精度题目叙述:A/BProblem题目描述输入两个整数\(a,b\),输出它们的商。输入格式两行,第一行是被除数,第二行是除数。输出格式一行,商的整数部分。样例#1样例输入#1102样例输出#15提示\(0\lea\le10^{5000}\),\(1\leb\le10^9\)。代码本题为高精......
  • leetcode 1486. 数组异或操作 https://leetcode.cn/problems/xor-operation-in-an-arr
    1486.数组异或操作题目描述给你两个整数,n和start。数组nums定义为:nums[i]=start+2*i(下标从0开始)且n==nums.length。请返回nums中所有元素按位异或(XOR)后得到的结果。示例示例1:输入:n=5,start=0输出:8解释:数组nums为[0,2,4,6,8],其中(0^......
  • Monty Hall problem
    Theproblemcanbeformulatedasfollows.Asaparticipantofagame show,youhavetochooseoneofthreedoors.Behindoneofthedoorsisa prize,behindtwootherdoorsisnothing.Afteryoupickadoor,thegame host,whoknowswheretheprizeis,se......
  • ARC181 - B - Annoying String Problem
    B-令人讨厌的字符串问题编辑:evima在大多数情况下,\(f(S,T,X)\)和\(f(S,T,Y)\)的长度相等,这揭示了\(T\)的长度。让我们来看看当已知\(S\)和\(T\)的长度时,在什么条件下\(S\)和\(T\)满足\(f(S,T,X)=f(S,T,Y)\)。例题例如,当\(|S|=6\)和\(|T|=4\)时,让我们考虑当\(S+......
  • 洛谷P1001 A+B Problem的一些歪解(淼作)
    一、LCT#include<iostream>#include<cstring>#include<cstdio>#include<cstring>usingnamespacestd;structnode{intdata,rev,sum;node*son[2],*pre;booljudge();boolisroot();voidpushdown();voidupda......
  • 【简单菊花图】Codeforce 1583Problem - B.md
    1583Problem-B-Codeforces题目大意:n个点的无根树给出m个限制条件(a,c,b)在a到b路径上不能存在c点,求任意一种可能的树的所有边注意数据范围:1<m<n<1e5这说明了最多有n-1个限制条件这说明至少有一个点不存在限制条件即这个点可以作为根节点root连接其他所有点形成边......