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;
}