牛客2019跨年AK场题解(一)

A 【牛】华华教月月做数学

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

题目描述

找到了心仪的小姐姐月月后,华华很高兴的和她聊着天。然而月月的作业很多,不能继续陪华华聊天了。华华为了尽快和月月继续聊天,就提出帮她做一部分作业。
月月的其中一项作业是:给定正整数A、B、P,求ABmod  PA^B\mod PABmodP的值。华华觉得这实在是毫无意义,所以决定写一个程序来做。但是华华并不会写程序,所以这个任务就交给你了。
因为月月的作业很多,所以有T组询问。

输入描述:

第一行一个正整数T表示测试数据组数。
接下来T行,每行三个正整数A、B、P,含义如上文。

输出描述:

输出T行,每行一个非负整数表示答案。

示例1

输入

复制

2
2 5 10
57284938291657 827493857294857 384729583748273

输出

复制

2
18924650048745

1<=a,b<=1e13

分析:快速幂+快速乘,为什么单单快速幂过不了,因为乘法可能溢出,这让我想起了第十八次csp认证为什么第五题连样例都过不去,估计也是乘法溢出的问题,其实计算机处理乘法也是一个个加,我们这里的快速乘其实就是logn级别的暴力~

#include <iostream>
#include<bits/stdc++.h>
#define ll long long
#define rg register ll
using namespace std;
ll t;
inline ll muti(ll a,ll b,ll p)
{
    ll res=0;
    while(b>0)
    {
        if(b&1)res=(res+a)%p;
        b>>=1;
        a=(a+a)%p;
    }
    return res;
}
inline ll powa(ll a,ll b,ll p)
{
    ll res=1;
    while(b>0)
    {
        if(b&1)res=muti(res,a,p);
        b>>=1;
        a=muti(a,a,p);
    }
    return res;
}
int main()
{
    cin>>t;
    for(int i=1;i<=t;i++)
    {
        ll a,b,c;
        cin>>a>>b>>c;
        cout<<powa(a,b,c)<<endl;
    }
    return 0;
}

E 约数

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

题目描述

Actci上课睡了一觉,下课屁颠屁颠的去找数学老师补课,问了老师一个题目:
    给出两个数a,b,问a和b的全部公约数是什么?
数学老师一看这道题太简单了,不屑回答,于是就交给了你。

输入描述:

一行两个数a,b.

输出描述:

a和b的全部公约数,每个数字之间空格隔开。

示例1

输入

复制

25 37

输出

复制

1

示例2

输入

复制

25 100

输出

复制

1 5 25

备注:

对于100%的数据,1 ≤ a,b ≤ 1013

分析 gcd先打一个,很明显答案都小于等于这个数,所以从这个数开始用sqrtn算法暴力就OK,注意最后要把该数的所有因子排有序,因为比如18,先搜到2,然后顺便把9加入因数集合,这个时候才轮到3,最后无脑输出即可~

#include <iostream>
#include<bits/stdc++.h>
#define ll long long
#define rg register ll
using namespace std;
ll n,m;
inline ll gcd(ll a,ll b)
{
    return !b?a:gcd(b,a%b);
}
vector<ll>v;
int main()
{
    cin>>n>>m;
    ll c=gcd(n,m);
    for(rg i=1;i*i<=c;i++)
    {
        if(c%i==0)
        {
            v.push_back(i);
            if(c/i!=i)v.push_back(c/i);
        }
    }
    sort(v.begin(),v.end());
    for(auto it:v)
    {
        cout<<it<<" ";
    }
    return 0;
}

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

题目描述

小 sun 非常喜欢放假,尤其是那种连在一起的长假,在放假的时候小 sun 会感到快乐,快乐值等于连着放假的天数,现在小 sun 把他的安排表告诉你,希望你告诉他在他的安排表中, 他的最大快乐值。 

当某天没有安排的时候就是放假。

输入描述:

第一行两个数n,m,代表总共有n天,m个安排。

接下来有m行,每行是一个安排l,r,代表从第l天到第r天,小sun有安排了。

安排可能会重复。

输出描述:

输出一行,在这个安排表中,小sun最大的快乐值。

示例1

输入

复制

5 1
2 3

输出

复制

2

备注:

数据范围:
n<=1e9,m<=1e5,1<=l,r<=n

首先我们注意到对于每一次安排我们都可以看成一段被标记的线段,那一个很直接的思路就是首先一个可能的答案就是最左端点减去起始点1的天数,然后就是不交叠的线段左端减去此时扫描到的最右端-1(我们可以先按左端点排序),最右端自然是一直取最大值~

#include <iostream>
#include<bits/stdc++.h>
#define ll long long
#define rg register ll
using namespace std;
ll n,m;
struct node
{
    ll l,r;
}p[100005];
inline bool cmp(node a,node b)
{
    if(a.l==b.l)return a.r<b.r;
    return a.l<b.l;
}
int main()
{
    cin>>n>>m;
    for(rg i=1;i<=m;i++)
    {
        cin>>p[i].l>>p[i].r;
    }
    sort(p+1,p+1+m,cmp);
    ll maxx=p[1].l-1,maxr=p[1].r;
    for(rg i=2;i<=m;i++)
    {

        maxr=max(maxr,p[i].r);
        maxx=max(p[i].l-maxr-1,maxx);
    }
    maxx=max(maxx,n-maxr);
    cout<<maxx<<endl;
    return 0;
}

OK,考试周的话有空再写吧,要考大雾了呢

发布了211 篇原创文章 · 获赞 137 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/weixin_43798170/article/details/103826518