牛客小白賽簽到題
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$%@#[email protected]”。
作為他後桌的你怎麼能看著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;
}