zoukankan      html  css  js  c++  java
  • 【洛谷P1069 细胞*】

    题目链接

     首先,光看题就觉得它很扯淡(你哪里来这么多的钱来买试管

    根据某位已经ak过ioi的名为ych的神仙说(一看就是数学题,一看就需要因式分解,emm,我果然没有发现美的眼睛qwq)

    那么我们就根据ych神仙的思路找到了通往AC的道路

    代码摘自(神仙的考试程序qwq)

    #include<cstdio>
    #include<iostream>
    #include<cstdlib>
    #include<iomanip>
    #include<cmath>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<time.h>
    #include<queue>
    #include<stack>
    using namespace std;
    inline int read()
    {
        int ans=0;
        char last=' ',ch=getchar();
        while(ch<'0'||ch>'9') last=ch,ch=getchar();
        while(ch>='0'&&ch<='9') ans=ans*10+ch-'0',ch=getchar();
        if(last=='-') ans=-ans;
        return ans;
    } 
    //首先这道题显然是道数学题(要不然这数据怎么玩)
    //样例1的解释启发我们这道题可以通过分解质因数做
    //这个题其实条件等价于求a^x=k(m1^m2)的最小x值 
    //我们可以对两边进行分解质因数
    //发现如果方程有解,则m1中不能包含a中没有的质因子 
    //但是a1的质因子可以比m1多 
    //那么最小的x就是找到最大的次数差值 
    struct prime
    {
        int cnt,pn[30001],t[30001];
    }p,q;//一个储存题目给的条件,一个储存判断 
    int n,m1,m2;
    inline void fenjie(int t,prime& p)//质因数分解2 
    {
        p.cnt=0;
        for(int i=2;i*i<=t;++i)
        {
            if(!(t%i))
            {
                p.pn[++p.cnt]=i;//记录第cnt个约数 
                p.t[p.cnt]=0;
                do
                {
                    t/=i;
                    ++p.t[p.cnt];//次数 
                }while(!(t%i));
            }
        }
        if(t>1)
        {
            p.pn[++p.cnt]=t;
            p.t[p.cnt]=1;
        }
    }
    int main()
    {
        freopen("cell.in","r",stdin);
         freopen("cell.out","w",stdout);
        n=read(),m1=read(),m2=read();
        if(m1==1) return cout<<0<<endl,0;//先判断一波特殊情况 
        fenjie(m1,p);//把m1分解,存到p里 
        int ans,x;
        ans=-1;
        for(int i=1;i<=n;i++)
        {
            x=read();
            fenjie(x,q);
            int maxn=0,nxt=1;
            //我们用nxt来存储x的下一个质因子的序号 
            bool flag=false;
            if(q.cnt>=p.cnt)
            //只有要求判断的数的质因子的个数>=题目给的条件的质因子的个数才能继续 
            for(int j=1;j<=p.cnt;j++)//枚举m1的每一个质因子 
            {
                while(q.pn[nxt]<p.pn[j]&&nxt<=q.cnt)++nxt;
                if(nxt>q.cnt||q.pn[nxt]>p.pn[j])break;//如果没有这个质因子就跳出 
                int f=p.t[j]*m2/q.t[nxt];
                if((p.t[j]*m2)%(q.t[nxt])) f++;
                //让这两个次数相等,因为有可能不整除,所以还要判断一下,相当于向上取整 
                if(maxn<f)maxn=f;//求最大值
                if(j==p.cnt) flag=1; //标记答案 
                else flag=0;
            }
            if(flag&&(ans==-1||ans>maxn))ans=maxn;
        }
        printf("%d
    ",ans);
        return 0; 
    }
  • 相关阅读:
    EIGRP系统复习【转载】
    EIGRP系统复习【转载】
    EIGRP系统复习【转载】
    新CCIE笔记之'口口相传'路由协议
    新CCIE笔记之'口口相传'路由协议
    新CCIE笔记之'口口相传'路由协议
    【★】自制网络心理需求大排名!
    【★】假如人类使用16进制
    【★】假如人类使用16进制
    算法之【大整数乘法】
  • 原文地址:https://www.cnblogs.com/gongcheng456/p/11047210.html
Copyright © 2011-2022 走看看