牛客小白赛签到题

A

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

勘测

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

题目描述

Actci偶然发现了一个矿洞,这个矿洞的结构类似与一棵二叉树,Actci发现的矿洞恰好位于根节点处,为了尽快挖掘,Actci找来了她的小伙伴们来帮忙,由于地质原因,每天小伙伴们只能打通到一条到子节点的道路(不消耗时间),也就是说每天一个节点只能向一个子节点建设道路,走一条路需要一天的时间,当发现一条道路后,会有一部分小伙伴选择留下来继续勘测,假设小伙伴们有无数个,树的深度足够大,问第n天最多共建设几条道路。

输入描述:

一行,一个数n。

输出描述:

一行,一个数表示最多建设的道路数,答案对 10000000007 取模。

示例1

输入

复制

2

输出

复制

3

说明

样例解释:
设n号点的子节点编号为n×2和n×2+1,根节点编号为1.
第一天1->2,在1,2处留有一部分人,道路数为1。
第二天1->3,2->4,在2,3,4处留有人,道路数为3.

示例2

输入

复制

100

输出

复制

6531708670

备注:

数据范围:
对于100%的数据保证 n ≤ 5×106

思路:

多写几组数据就发现ans[n] = (ans[i - 1] + fibo[i] + fibo[i - 1] )% 1e10 + 7;

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod = 1e10 + 7;
const int maxn = 5e6 + 2;
ll a[maxn],f[maxn];
int main()
{
    f[1] = a[1] = 1;
    int n;
    scanf("%d",&n);
    for (int i = 2;i <= n;i ++)
    {
        f[i] = (f[i - 1] + f[i - 2]) % mod;
        a[i] = (a[i - 1] + f[i] + f[i - 1]) % mod;
    }
    printf("%lld\n",a[n]);
    return 0;
}

B

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

数学

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

题目描述

某年某月某天的数学课上,Actci正在遨游宇宙呢,对于他的屡教不改,她的数学老师决定难为一下Actci,将他叫醒。
“咳咳,我现在给出一个数a(0≤a≤1010000),判断a是否是3,5,8,11中某些数的的倍数,你只有一秒钟的时间,答不上来的话,呵,%#W$%@#$@...”。

作为他后桌的你怎么能看着Actci“受害”呢,于是你决定帮帮他。
 

输入描述:

一行,一个数 a。

输出描述:

两行。
第一行输出 Yes 或 No,表示这个数是否是这四个数中一个或几个数的倍数。
第二行,a是哪些数的倍数,每个数用空格隔开(顺序从小到大),若第一行为 No 则不用输出。

示例1

输入

复制

123456789

输出

复制

Yes
3

示例2

输入

复制

2341232402462055420

输出

复制

Yes
3 5

示例3

输入

复制

9741427

输出

复制

No

思路:

3的话很简单,每个数加一块能够除尽3就行,5的话只看个位数是否为0或5,8的话可以判断后三位的数是否除尽,11的话就是根据同余定理过一遍,当然,直接全部过一遍也差不多

代码:

#include<bits/stdc++.h>
using namespace std;
string s;
vector<int> ve;
int main()
{
    int a1 = 0,a2 = 0;
    cin>>s;
    int len = s.size();
    for (int i = 0;i < len;i ++)
    {
        a2 += s[i] - '0';
        a1 = a1 * 10 + s[i] - '0';
        a1 %= 11;
    }
    if (a2 % 3 == 0) ve.push_back(3);
    a2 = s[len - 1] - '0';
    if (!a2 || a2 == 5) ve.push_back(5);
    a2=s[len-1]-'0'+(s[len-2]-'0')*10+s[len-3]*100;
    if (a2 % 8 == 0) ve.push_back(8);
    if (!a1) ve.push_back(11);
    if (!ve.empty()) puts("Yes");
    else puts("No");
    bool flag = 0;
    for (int i = 0;i < ve.size();i ++)
    {
        if (flag) cout<<' ';
        flag = 1;
        cout<<ve[i];
    }
    return 0;
}

C

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

约数

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

题目描述

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

输入描述:

一行两个数a,b.

输出描述:

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

示例1

输入

复制

25 37

输出

复制

1

示例2

输入

复制

25 100

输出

复制

1 5 25

备注:

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

思路:

直接求出来最大公约数,O(sqrt(n))扫一遍它的因子就好了

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll f[1000];
ll gcd(ll a,ll b)
{
    return b ? gcd(b,a % b) : a;
}
int main()
{
    ll pos = 0,n,m,x,y;
    scanf("%lld %lld",&n,&m);
    y = gcd(n,m),x = sqrt(y);
    for (ll i = 1;i <= x;i ++)
    {
        if (y % i == 0)
            f[pos ++] = i,f[pos ++] = y / i;
    }
    sort(f,f + pos);
    printf("1");
    for (int i = 1;i < pos;i ++)
        if (f[i] != f[i - 1])
            printf(" %lld",f[i]);
    putchar('\n');
    return 0;
}

D

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

饥饿

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

题目描述

夕阳西下,匆匆忙忙间,SSJ一天的课程已经全部上完了,肚子咕咕开始叫了,坐上回家的公交车,可是SSJ今天好像有点迷,据说今中午吃饭时没去食堂,走着走着,外边景色好美啊,啊?我好像没走过这,完了,我好想迷路了。
公交车到了终点站,SSJ下车了,内心无比紧张,回不去了,一阵冷风吹过,瑟瑟发抖,emm...,那是一张地图?地图上有啥大家都明白,SSJ现在已经饿得无力思考了,请你帮他设计一条最快回家的路下,他要快点回家吃xxx。

输入描述:

第一行四个数n,m,s,t。(分别表示有地图上n个地点,m条道路,SSJ在s处,他家在t处)第2-m+1三个正整数,f,u(某条路起点),v(到达点),w(路径距离)。(f为1或0,0表示这条道路上有恶狗拦路,SSJ已无力与恶狗打斗了,所以他要避开这些道路,1表示此条道路无危险)。

输出描述:

第一行一个数表示最短路径长度,若无法回家输出“My gold!!!”(无引号)若可以回家.

示例1

输入

复制

5 7 1 5
0 1 4 4
1 1 3 2
1 1 5 7
1 2 5 10
0 2 3 1
1 3 5 2
1 4 3 7

输出

复制

4

备注:

n≤10000,m≤200000,w≤5000000

思路:

迪杰斯特拉最短路裸题,据说用long long过不去,不过我本来没准备过用的int反而一发入魂(笑cry)

代码:

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
const int maxn = 1e4 + 10;
struct edge
{
    int to,cost;
    bool friend operator <(edge a,edge b)
    {
        return a.cost > b.cost;
    }
};

vector <edge> ve[maxn];
bool vis[maxn];
int dis[maxn],n,m;
void djk(int s,int t)
{
    for (int i = 0;i <= n;i ++) dis[i] = inf;
    priority_queue<edge> que;
    edge p,p2;
    p.to = s,p.cost = 0;
    dis[s] = 0;
    que.push(p);
    while (!que.empty())
    {
        p = que.top();
        que.pop();
        if (vis[p.to]) continue;
        vis[p.to] = 1;
        for (int i = 0;i < ve[p.to].size();i ++)
        {
            p2 = ve[p.to][i];
            if (!vis[p2.to] && p2.cost + dis[p.to] < dis[p2.to])
            {
                dis[p2.to] = dis[p.to] + p2.cost;
                que.push(edge{p2.to,dis[p2.to]});
            }
        }
    }
    if (dis[t] != inf) printf("%d\n",dis[t]);
    else puts("My gold!!!");
}
int main()
{
    int s,t,u,v,w,f;
    scanf("%d %d %d %d",&n,&m,&s,&t);
    for (int i = 0;i < m;i ++)
    {
        scanf("%d %d %d %d",&f,&u,&v,&w);
        if (f)
        {
            ve[u].push_back(edge{v,w});
            ve[v].push_back(edge{u,w});
        }
    }
    djk(s,t);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/cloudy_happy/article/details/85218751