zoukankan      html  css  js  c++  java
  • 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛

    拖了好久了

    链接:https://www.nowcoder.com/acm/contest/90/A
    来源:牛客网

    跳台阶
    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 32768K,其他语言65536K
    64bit IO Format: %lld

    题目描述

    小明在坐景驰科技研发的无人车到达了目的地。
    景驰科技(JingChi.ai)是一家由人工智能技术驱动、以无人驾驶技术为核心的智能出行公司。它将打造面向中国市场的全无人驾驶。
    从无人车下来以后,小明看到了一个长长的楼梯。
    有一个n级台阶的楼梯,小明一次可以向上跳1步,两步,甚至是n步,请问小明跳到n级台阶有多少种跳法?

    输入描述:

    第一行输入一个整数t,代表有t组样例:( T<=30)
    接下来的t行,都用一个整数n,表示楼梯有n级台阶( 1<=n<=30)

    输出描述:

    输出跳到第n级台阶有多少种跳法
    示例1

    输入

    1
    1

    输出

    1

    跳台阶的正常问题,可以到n步,每次都是前一次的两倍,猜了一发答案还错了

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
        int T;
        cin>>T;
        while(T--)
        {
            int n;
            cin>>n;
            cout<<(1<<(n-1))<<"
    ";
        }
        return 0;
    }

    链接:https://www.nowcoder.com/acm/contest/90/D
    来源:牛客网

    psd面试
    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 32768K,其他语言65536K
    64bit IO Format: %lld

    题目描述

    掌握未来命运的女神 psd 师兄在拿了朝田诗乃的 buff 后决定去实习。
    埃森哲公司注册成立于爱尔兰,是一家全球领先的专业服务公司,为客户提供战略、咨询、数字、技术和运营服务及解决方案。他们立足商业与技术的前沿,业务涵盖40多个行业,以及企业日常运营部门的各个职能。凭借独特的业内经验与专业技能,以及翘楚全球的交付网络,他们帮助客户提升绩效,并为利益相关方持续创造价值。埃森哲是《财富》全球500强企业之一,目前拥有约41.1万名员工,服务于120多个国家的客户。于是psd打算去埃森哲公司投一下简历。
    于是他用英文写了一篇简历,由于手速太快了以致自己都不知道写了什么。
    然而面试官 xwc 一眼就看到了重点:大学打过 ACM!
    xwc:“
        听说你很低袄?考你个题:
        忽略字母大小写,你这篇简历去掉最长的回文子序列后还有多长?

    psd 顺手就把这个问题抛给了你。

    输入描述:

    多组输入,每组输入一个长度不超过 1234 的没空格的字符串,是 psd 的简历。

    输出描述:

    每组输出一个整数,如题。
    示例1

    输入

    google

    输出

    2
    示例2

    输入

    aBc,bAd

    输出

    2

    经典的dp原题

    #include<bits/stdc++.h>
    using namespace std;
     
    const int N = 1235;
    char str[N];
    int dp[N][N];
     
    int main()
    {
        while(~scanf("%s",str))
        {
            for(int i=0; str[i]; i++)
                if(str[i]>='A'&&str[i]<='Z')
                    str[i]+=32;
            memset(dp,0,sizeof(dp));
            int len = strlen(str);
            for(int i = len-1; i >= 0; --i)
            {
                dp[i][i] = 1;
                for(int j = i+1; j < len; ++j)
                    if(str[i] == str[j])
                        dp[i][j] = dp[i+1][j-1]+2;
                    else
                        dp[i][j] = max(dp[i][j-1],dp[i+1][j]);
            }
            printf("%d
    ",len-dp[0][len-1]);
        }
        return 0;
    }

    链接:https://www.nowcoder.com/acm/contest/90/E
    来源:牛客网

    回旋星空
    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 131072K,其他语言262144K
    64bit IO Format: %lld

    题目描述

    曾经有两个来自吉尔尼斯的人(A和C)恋爱了,他们晚上经常在一起看头上的那片名为假的回旋星空,

    有一天他们分手了,A想通过回旋星空测量他们之间的复合指数,测量的规则是,

    计算回旋图标的个数,即选中三颗星星,分别作为回旋图标的起点,拐点和终点,假设现在有三个

    星星分别为i,j,k,如果d(a[i],a[j]) == d(a[j],a[k])则表示找到了一个回旋图标,其中d(x,y)表示这两个点的欧氏距离

    为了给它很大的希望(i,j,k)和(k,j,i)被认为是两个不同的回旋图标

     

    A花了一晚上终于把整片星空映射到了一张二平面图上,由于星星太多以至于A有点懵逼,所以

    你能帮帮他吗,要不然他可能真的WA的一声哭了出来
    作为埃森哲公司的一员,你在解决问题的同时也向A介绍了埃森哲公司的业务范围。
    为了全方位地满足客户的需求,正在不断拓展自身的业务服务网络,包括管理及信息技术咨询、企业经营外包、企业联盟和风险投资。除了以产品制造业、通信和高科技、金融服务、资源、政府机构等不同行业划分服务内容之外,还从以下几方面提供咨询服务:
    1.客户关系管理
    2.业务解决方案
    3.电子商务
    4.供应链管理

    输入描述:

    第一行一个整数T(T<=10),表示组数

    对于每组数据有一个n,表示有n个小星星(0< n < 1000)

    接下来跟着n行,每行跟两个整数xi和yi表示每个星星的坐标(-10000< xi, yi<10000)

    输出描述:

    对于每组数据,如果没有找到回旋图标输出”WA”,否则输出找到图标个数
    示例1

    输入

    2
    2
    1 0
    0 1
    3
    1 0
    0 1
    0 0

    输出

    WA
    2

    备注:

    没有重复的星星,且选中的三个星星是互相不一样的(即下标不同)
    欧氏距离即直线距离

    搞一下这个距离不就好了,n个里面拿两个

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long int
    int main()
    {
        ios::sync_with_stdio(false);
        int t;
        cin>>t;
        while(t--)
        {
            int n;
            ll sum=0,x[1005],y[1005];
            cin>>n;
            for(int i=0;i<n;++i)
                cin>>x[i]>>y[i];
            for(int i=0;i<n;++i)
            {
                map<ll,int> ma;
                for(int j=0;j<n;++j)
                    ma[ (x[i]-x[j])*(x[i]-x[j]) + (y[i]-y[j])*(y[i]-y[j])   ]++;
                for(map<ll,int>::iterator it=ma.begin();it!=ma.end();++it)
                {
                    if(it->second>=2)
                        sum+=(it->second*(it->second-1))/2;
                }
            }
            if(sum==0)cout<<"WA"<<endl;
            else cout<<sum*2<<endl;
        }
        return 0;
    }

    链接:https://www.nowcoder.com/acm/contest/90/F
    来源:牛客网

    等式
    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 32768K,其他语言65536K
    64bit IO Format: %lld

    题目描述

    给定n,求1/x + 1/y = 1/n (x<=y)的解数。(x、y、n均为正整数)


    输入描述:

    在第一行输入一个正整数T。
    接下来有T行,每行输入一个正整数n,请求出符合该方程要求的解数。
    (1<=n<=1e9)

    输出描述:

    输出符合该方程要求的解数。
    示例1

    输入

    3
    1
    20180101
    1000000000

    输出

    1
    5
    181

    把他化简一下,(x-n)(y-n)=n^2

    其实就是处理n*n的因子个数

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int times=20;
    const int N=100;
    ll mult_mod(ll a,ll b,ll mod)
    {
        a%=mod;
        b%=mod;
        ll res=0;
        while(b)
        {
            if(b&1)
            {
                res+=a;
                res%=mod;
            }
            a<<=1;
            if(a>=mod) a%=mod;
            b>>=1;
        }
        return res;
    }
    ll pow_mod(ll x,ll n,ll mod)
    {
        if(n==1) return x%mod;
        x%=mod;
        ll t=x;
        ll res=1;
        while(n)
        {
            if(n&1) res=mult_mod(res,t,mod);
            t=mult_mod(t,t,mod);
            n>>=1;
        }
        return res;
    }
    bool test(ll a,ll n,ll x,ll t)
    {
        ll res=pow_mod(a,x,n);
        ll last=res;
        for(int i=1; i<=t; i++)
        {
            res=mult_mod(res,res,n);
            if(res==1&&last!=1&&last!=n-1) return true;
            last=res;
        }
        if(res!=1) return true;
        return false;
    }
    bool miller_rabin(ll n)
    {
        if(n<2) return false;
        if(n==2) return true;
        if((n&1)==0) return false;
        ll x=n-1,t=0;
        while((x&1)==0)
        {
            x>>=1;
            t++;
        }
        for(int i=0; i<times; i++)
        {
            ll a=rand()%(n-1)+1;
            if(test(a,n,x,t)) return false;
        }
        return true;
    }
    ll factor[N];
    int tot;
    ll gcd(ll a,ll b)
    {
        if(a==0) return 1;
        if(a<0) return gcd(-a,b);
        while(b)
        {
            ll c=a%b;
            a=b;
            b=c;
        }
        return a;
    }
    ll pollard_rho(ll x,ll c)
    {
        ll i=1,k=2;
        ll x0=rand()%x;
        ll y=x0;
        while(1)
        {
            i++;
            x0=(mult_mod(x0,x0,x)+c)%x;
            ll d=gcd(y-x0,x);
            if(d!=1&&d!=x) return d;
            if(y==x0) return x;
            if(i==k)
            {
                y=x0;
                k+=k;
            }
        }
    }
    void find_factor(ll n)
    {
        if(miller_rabin(n))
        {
            factor[tot++]=n;
            return ;
        }
        ll p=n;
        while(p>=n) p=pollard_rho(p,rand()%(n-1)+1);
        find_factor(p);
        find_factor(n/p);
    }
    int main()
    {
        srand(time(0));
        int t;
        cin>>t;
        while(t--)
        {
            int n;
            cin>>n;
            if(n==1)
                cout<<"1
    ";
            else
            {
                tot=0;
                if(miller_rabin(n)||n<=1)
                    factor[tot++]=n;
                else
                {
                    find_factor(n);
                    sort(factor,factor+tot);
                }
                map<int,int>M;
                for(int i=0; i<tot; i++)
                    M[factor[i]]++;
                int ans=1;
                for(auto X:M)
                {
                    ans=ans*(2*X.second+1);
                }
                cout<<(ans+1)/2<<"
    ";
            }
        }
        return 0;
    }

    朴素的素数筛选就可以过的,上面非常sb的用了大素数分解

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
        int T; 
        scanf("%d",&T);
        while (T--)
        {
            int n; 
            scanf("%d",&n); 
            long long ans=1;
            for (int i=2;i*i<=n;++i) 
                if (n%i==0)
                {
                    int t=1; 
                    while (n%i==0) n/=i,t+=2;
                    ans*=t;
                }
            if (n!=1) ans*=3;
            printf("%lld
    ",(ans+1)/2);
        }
    }

    链接:https://www.nowcoder.com/acm/contest/90/G
    来源:牛客网

    旋转矩阵
    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 32768K,其他语言65536K
    64bit IO Format: %lld

    题目描述

    景驰公司自成立伊始,公司便将“推动智能交通的发展,让人类的出行更安全,更高效,更经济,更舒适”作为公司使命,通过产业融合、建设智能汽车出行行业的方式,打造“利国、利民、利公司、利个人”的无人驾驶出行系统。公司的愿景是成为中国第一、世界一流的智能出行公司。

    有一天,景驰公司的工程师在真车上做测试。
    景驰公司的试验车上面有一个奇怪的图案,这是一个n*m的矩阵,这辆车可以到处开,每次可以左旋右旋,小明想知道转完之后的图案是怎么样的
    具体来说:有一个n*m的字符矩阵,只包含3种字符(‘+’‘-’,‘|’),通过一通乱旋之后变成什么样子?

    输入描述:

    第一行测试样例数T(0<T<=100)
    每个测试样例第一行两个正整数n,m(0<n,m<=30)
    接下来的n行是一个n*m的字符矩阵
    字符矩阵之后是一串只包含‘L’(左旋)和‘R’(右旋)的字符串,长度不超过1000
    每个样例间输出一个空行

    输出描述:

    第一行两个正整数n,m
    接下来的n行是一个n*m的字符矩阵
    每个样例后面输出一个空行
    示例1

    输入

    2
    2 3
    +-+
    |+|
    LLRRR
    
    3 2
    -+
    +|
    -+
    LLL

    输出

    3 2
    -+
    +|
    -+
    
    2 3
    |+|
    +-+

    备注:

    左旋即逆时针旋转,右旋即顺时针旋转
    -通过一次左旋或右旋会变成|
    |通过一次左旋或右旋会变成-

    就是一个大模拟

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long int
    string s[50],str;
    int main()
    {
     
        int t;
        cin>>t;
        while(t--)
        {
            int n,m,x=0;
            cin>>n>>m;
            for(int i=0; i<n; i++)
            {
                cin>>s[i];
            }
            cin>>str;
            for(int i=0; str[i]; i++)
                if(str[i]=='L')
                    x++;
                else
                    x--;
            x=(x%4+4)%4;
            if(x==0)
            {
                cout<<n<<" "<<m<<endl;
                for(int i=0; i<n; i++)
                    cout<<s[i]<<endl;
            }
            else if(x==1)
            {
                cout<<m<<" "<<n<<endl;
                for(int i=m-1; i>=0; i--)
                {
                    for(int j=0; j<n; j++)
                        if(s[j][i]=='|')cout<<"-";
                        else if(s[j][i]=='-')cout<<"|";
                        else cout<<s[j][i];
                    cout<<endl;
                }
            }
            else if(x==2)
            {
                cout<<n<<" "<<m<<endl;
                for(int i=n-1; i>=0; i--)
                    reverse(s[i].begin(),s[i].end()),cout<<s[i]<<endl;
            }
            else if(x==3)
            {
                cout<<m<<" "<<n<<endl;
                for(int i=0; i<m; i++)
                {
                    for(int j=n-1; j>=0; j--)
                        if(s[j][i]=='|')cout<<"-";
                        else if(s[j][i]=='-')cout<<"|";
                        else cout<<s[j][i];
                    cout<<endl;
                }
            }
            cout<<'
    ';
        }
        return 0;
    }

    链接:https://www.nowcoder.com/acm/contest/90/I
    来源:牛客网

    填空题
    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 32768K,其他语言65536K
    64bit IO Format: %lld

    题目描述


    牛客网是是一个专注于程序员的学习和成长的专业平台,集笔面试系统、课程教育、社群交流、招聘内推于一体,同时它也是全国最大的IT题库,刷真题,练算法,看面经,得内推,全面提升你的技术水平、推荐最好的工作给你。Tmk很喜欢在牛客网上刷题。

    回想起Tmk第一次看到牛客网的时候觉得很棒,就想赶紧做一道题。

    于是他打开了a+b problem,题目是这样的,输入a和b,输出a+b=?

    例如输入3和4,输出3+4=7.

    Tmk觉得好难,通过了与小伙伴们激烈的讨论,然后打下了下面的代码:

    #include <cstdio>

        using namespace std;

        Int main()

        {

            Int a,b,c;

            scanf(“%d %d”,&a,&b);

            c=a+b;

            printf(“%d+%d=%d”,?,b,?);

            return 0;

    }

    Tmk懵逼了,他不知道?那里应该是填什么字母,现在他好想去ac这道题,请问这两个问号的位置应该用什么代替呢?(一个?的位置应该填一个字母)

    输入描述:

    输出描述:

    直接输出第一个问号所表示的字母和第二个问号所表示的字母。中间没有空格。
    示例1

    输入

    null

    输出

    null

    说明

    题目无输入,只要输出答案即可

    签到,输出两个字符

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long int
    int main()
    {
        printf("ac
    ");
        return 0;
    }

    链接:https://www.nowcoder.com/acm/contest/90/J
    来源:牛客网

    强迫症的序列
    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 32768K,其他语言65536K
    64bit IO Format: %lld

    题目描述

    牛客网是IT求职神器,提供海量C++、JAVA、前端等职业笔试题库,在线进行百度阿里腾讯网易等互联网名企笔试面试模拟考试练习,和牛人一起讨论经典试题,全面提升你的编程。作为acmer的小A,牛客网是他首选的题库。
    小A是一个中度强迫症患者,每次做数组有关的题目都异常难受,他十分希望数组的每一个元素都一样大,这样子看起来才是最棒的,所以他决定通过一些操作把这个变成一个看起来不难受的数组,但他又想不要和之前的那个数组偏差那么大,所以他每次操作只给这个数组的其中n-1个元素加1,但是小A并不能很好的算出最优的解决方案,如果你能帮他解决这个问题,小A就能送你一个气球

    输入描述:

    第一行一个整数T(T<=100),表示组数

    对于每组数据有一个n,表示序列的长度(0< n <100000)

    下面一行有n个数,表示每个序列的值(0<ai<1000)

    输出描述:

    输出两个数
    第一个数表示最小的操作步数
    第二个数经过若干步以后的数组元素是什么
    示例1

    输入

    1
    3
    1 2 3

    输出

    3 4

    随便写啊,有点贪心的思想?

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long int
    int main()
    {
        ios::sync_with_stdio(false);
        int t;
        cin>>t;
        while(t--)
        {
            ll sum=0,x,minn=1e9;
            int n;
            cin>>n;
            for(int i=0; i<n; i++)
                cin>>x,sum+=x,minn=min(minn,x);
            ll num=sum-n*minn;
            cout<<num<<" "<<(sum+num*(n-1))/n<<"
    ";
        }
        return 0;
    }

    链接:https://www.nowcoder.com/acm/contest/90/K
    来源:牛客网

    密码
    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 262144K,其他语言524288K
    64bit IO Format: %lld

    题目描述

    ZiZi登录各种账号的时候,总是会忘记密码,所以他把密码都记录在一个记事本上。其中第一个密码就是牛客网的密码。

    牛客网专注于程序员的学习、成长及职位发展,连接C端程序员及B端招聘方,通过IT笔试面试题库、在线社区、在线课程等提高候选人的求职效率,通过在线笔试、面试及其他工具提升企业的招聘效率。

    团队由来自Google、百度、阿里、网易等知名互联网巨头的热血技术青年组成,用户覆盖全国2000多所高校的100W求职程序员及全部一线互联网企业,并仍在高速增长中。

    谨慎的ZiZi当然不会直接把密码记录在上面,而是把上面的字符串经过转化后才是真正的密码。转化的规则是把字符串以n行锯齿形写出来,然后再按从左到右,从上到下读取,

    即为真正的密码。如ABABCADCE以3行写出:

      

    所以真正的密码是ACEBBACAD。但是每一次都要写出来就太麻烦了,您如果能帮他写出一个转换程序,他就送你一个气球。

    输入描述:

    第一行一个整数T,表示数据组数
    对于每组数据,首先一个正整数n(n<=100,000),然后下一行为一个字符串,字符串长度len<=100,000。

    输出描述:

    对于每组数据,输出一个字符串,代表真正的密码。
    示例1

    输入

    1
    3
    ABABCADCE

    输出

    ACEBBACAD

    这个也是大力模拟啊,可是我竟然打错了

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long int
    char s[100005];
    string ans;
    int main()
    {
     
        int t;
        scanf("%d",&t);
        while(t--)
        {
            int n;
            scanf("%d",&n);
            scanf("%s",s+1);
            int l=strlen(s+1);
            if(n==1)
            printf("%s
    ",s+1);
            else
            {
            ans="";
            for(int i=1; i<=l; i+=2*n-2)
                ans+=s[i];
            for(int i=2; i<n; i++)
            {
                for(int j=i; j<=l; j+=2*n-2)
                {
                    ans+=s[j];
                    if(j-i+2*n-i<=l)ans+=s[j-i+2*n-i];
                }
            }
            for(int i=n; i<=l; i+=2*n-2)
                ans+=s[i];
            cout<<ans<<"
    ";
            }
        }
        return 0;
    }

    链接:https://www.nowcoder.com/acm/contest/90/L
    来源:牛客网

    用来作弊的药水
    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 32768K,其他语言65536K
    64bit IO Format: %lld

    题目描述

        在一个风雨交加的夜晚,来自异世界的不愿透露姓名的TMK同学获得了两种超强药水A、B。根据说明书,TMK知道了这两种药水的作用:
        (1)药水A能使人的生命值提高,每饮用1个单位能使他生命值变成原来的x倍,即每饮用p个单位能使他的生命值变成原来的x^p(x的p次方)倍。
        (2)药水B能使人的能量值提高,每饮用1个单位能使他能量值变成原来的y倍,即每饮用q个单位能使他的能量值变成原来的y^q(y的q次方)倍。
        于是TMK迫不及待地喝下了所有的a个单位的药水A和b个单位的药水B,他立马体会到了自己能力的超强变化,然后他看了接下来的说明书:
        药水A和药水B能互相抑制对方的负面效果,一旦生命值提升的倍数和能量值提升的倍数不相等,那么在五个小时后将会发生非常严重的后果。
        于是TMK同学慌了,他想知道自己提升的生命值和能量值的倍数是否相等,由于他非常慌张,所以他把计算的重任交给你了。

    作为埃森哲公司的一员,你觉得这个问题很简单,这得益于埃森哲公司分享知识的文化。

       分享知识已成为埃森哲源远流长的文化。
       埃森哲公司在帮助客户进行行之有效的知识管理的同时,它的管理层在其内部也进行了成功的知识管理的实践。如今,在埃森哲,分享知识已成为其源远流长的文化。在很大程度上,埃森哲公司的成功得益于其强大的知识管理系统。



    输入描述:

    第一行一个整数T,代表有T组数据。(1<=T<=5000)
    每组数据仅一行,包含四个整数x,a,y,b,意义为题目描述。(1<=x,a,y,b<=10^9)

    输出描述:

    每组数据输出一行"Yes"或"No"(不包含双引号),表示TMK提升的生命值和能量值的倍数是否相等,相等为"Yes",不相等为"No"。
    示例1

    输入

    4
    2 20 4 10
    20 20 20 20
    20 21 21 20
    32768 32768 1048576 24576

    输出

    Yes
    Yes
    No
    Yes

    这个%一下就行,双HASH也不错,如果小的话可以直接分解,我这里还是用了大素数分解

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int times=20;
    const int N=100;
    ll mult_mod(ll a,ll b,ll mod)
    {
        a%=mod;
        b%=mod;
        ll res=0;
        while(b)
        {
            if(b&1)
            {
                res+=a;
                res%=mod;
            }
            a<<=1;
            if(a>=mod) a%=mod;
            b>>=1;
        }
        return res;
    }
    ll pow_mod(ll x,ll n,ll mod)
    {
        if(n==1) return x%mod;
        x%=mod;
        ll t=x;
        ll res=1;
        while(n)
        {
            if(n&1) res=mult_mod(res,t,mod);
            t=mult_mod(t,t,mod);
            n>>=1;
        }
        return res;
    }
    bool test(ll a,ll n,ll x,ll t)
    {
        ll res=pow_mod(a,x,n);
        ll last=res;
        for(int i=1; i<=t; i++)
        {
            res=mult_mod(res,res,n);
            if(res==1&&last!=1&&last!=n-1) return true;
            last=res;
        }
        if(res!=1) return true;
        return false;
    }
    bool miller_rabin(ll n)
    {
        if(n<2) return false;
        if(n==2) return true;
        if((n&1)==0) return false;
        ll x=n-1,t=0;
        while((x&1)==0)
        {
            x>>=1;
            t++;
        }
        for(int i=0; i<times; i++)
        {
            ll a=rand()%(n-1)+1;
            if(test(a,n,x,t)) return false;
        }
        return true;
    }
    ll factor[N];
    int tot;
    ll gcd(ll a,ll b)
    {
        if(a==0) return 1;
        if(a<0) return gcd(-a,b);
        while(b)
        {
            ll c=a%b;
            a=b;
            b=c;
        }
        return a;
    }
    ll pollard_rho(ll x,ll c)
    {
        ll i=1,k=2;
        ll x0=rand()%x;
        ll y=x0;
        while(1)
        {
            i++;
            x0=(mult_mod(x0,x0,x)+c)%x;
            ll d=gcd(y-x0,x);
            if(d!=1&&d!=x) return d;
            if(y==x0) return x;
            if(i==k)
            {
                y=x0;
                k+=k;
            }
        }
    }
    void find_factor(ll n)
    {
        if(miller_rabin(n))
        {
            factor[tot++]=n;
            return ;
        }
        ll p=n;
        while(p>=n) p=pollard_rho(p,rand()%(n-1)+1);
        find_factor(p);
        find_factor(n/p);
    }
    int main()
    {
        srand(time(0));
        int t;
        scanf("%d",&t);
        ll n;
        while(t--)
        {
            int a,b,c,d;
            scanf("%d%d%d%d",&a,&b,&c,&d);
            if(a==1&&c==1)
                printf("Yes
    ");
            else
            {
                tot=0;
                if(miller_rabin(a)||a<=1)
                    factor[tot++]=a;
                else
                {
                    find_factor(a);
                    sort(factor,factor+tot);
                }
                map<int,int>M1,M2;
                for(int i=0; i<tot; i++) M1[factor[i]]++;
                tot=0;
                if(miller_rabin(c)||c<=1)
                    factor[tot++]=c;
                else
                {
                    find_factor(c);
                    sort(factor,factor+tot);
                }
                for(int i=0; i<tot; i++) M2[factor[i]]++;
                if(M1.size()!=M2.size())printf("No
    ");
                else
                {
                    map<int,int>::iterator it;
                    it=M1.begin();
                    int f=1;
                    for(auto X:M2)
                    {
                        if(X.first!=it->first||X.second*1LL*d!=it->second*1LL*b)f=0;
                        it++;
                    }
                    if(f)printf("Yes
    ");
                    else printf("No
    ");
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    java-connect-mysql
    搜索框提示列表问题
    方法中的函数会掩盖this,解决办法!
    关于W3C盒子布局
    将类数组转化成数组
    js获取元素宽高
    使用gulp添加版本号
    flex布局
    排序-冒泡排序
    js事件、自定义dom事件、自定义事件
  • 原文地址:https://www.cnblogs.com/BobHuang/p/8872860.html
Copyright © 2011-2022 走看看