天天看點

牛客小白月賽10 A,B,C,D

​​傳送門​​

連結:https://ac.nowcoder.com/acm/contest/280/A

題目描述

Actci偶然發現了一個礦洞,這個礦洞的結構類似與一棵二叉樹,Actci發現的礦洞恰好位于根節點處,為了盡快挖掘,Actci找來了她的小夥伴們來幫忙,由于地質原因,每天小夥伴們隻能打通到一條到子節點的道路(不消耗時間),也就是說每天一個節點隻能向一個子節點建設道路,走一條路需要一天的時間,當發現一條道路後,會有一部分小夥伴選擇留下來繼續勘測,假設小夥伴們有無數個,樹的深度足夠大,問第n天最多共建設幾條道路。

連結:https://ac.nowcoder.com/acm/contest/280/A

輸入描述:

一行,一個數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      

找規律

#include<bits/stdc++.h> 
using namespace std;
typedef long long ll;
const ll mod=10000000007;
ll n,s1,s2,t;
ll f[10000010],ans;
int main() {
    cin>>n;
    f[1]=1;f[2]=2;
    for(int i=3;i<=n;i++) f[i]=(f[i-1]+f[i-2])%mod;
    for(int i=1;i<=n;i++) ans=(ans+f[i])%mod;
    cout<<ans<<endl;
    return 0;
}      

連結:https://ac.nowcoder.com/acm/contest/280/B

輸入描述:

一行,一個數 a。

輸出描述:

兩行。

第一行輸出 Yes 或 No,表示這個數是否是這四個數中一個或幾個數的倍數。

第二行,a是哪些數的倍數,每個數用空格隔開(順序從小到大),若第一行為 No 則不用輸出。

示例1

輸入

123456789      

輸出

Yes
    3      

示例2

輸入

2341232402462055420      

輸出

Yes
3 5      

示例3

輸入

9741427      

輸出

No      

字元串模拟大數運算

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 1e4 + 10;

const LL inf = 0x3f3f3f3f;
 
char s[maxn];
int a[11];
 
bool isok(int k){
    int tem = 0;
    for (int i=0; s[i]!='\0'; i++)  tem = (tem * 10 + (s[i] - '0')) % k;
    if (tem == 0)  return true;
    else  return false;
}
int main(){
    scanf("%s", s);
    int k = 0;
    for (int i=1; i<=4; i++){
        int x;
        if (i == 1)  x = 3;
        else if (i == 2)  x = 5;
        else if (i == 3)  x = 8;
        else if (i == 4)  x = 11;
        if (isok(x))  a[++k] = x;
    }
 
    if (k == 0)  puts("No");
    else {
        puts("Yes");
        for (int i=1; i<k; i++)  printf("%d ", a[i]);
        printf("%d\n", a[k]);
    }
    return 0;
}      

連結:https://ac.nowcoder.com/acm/contest/280/C

題目描述

Actci上課睡了一覺,下課屁颠屁颠的去找數學老師補課,問了老師一個題目:

給出兩個數a,b,問a和b的全部公約數是什麼?

數學老師一看這道題太簡單了,不屑回答,于是就交給了你。

輸入描述:

一行兩個數a,b.

輸出描述:

a和b的全部公約數,每個數字之間空格隔開。

示例1

輸入

25 37      

輸出

1      

示例2

輸入

25 100      

輸出

1 5 25      

備注:

對于100%的資料,1 ≤ a,b ≤ 1013      

兩個數的乘積等于這兩個數的最大公約數與最小公倍數的乘積。

假設兩個數為 a和b,他們的最大公約數是a/c,

那麼他們的最小公倍數為 (a/c) a/(a/c) * b/(a/c)。

化簡後得: b!c

是以 最大公約數 乘以 最小公倍數 = (a/c) * (bc) =a*b

兩個數的最大公因數一定是這兩個數的因數,兩個數的最小公倍數一定是這兩個數的倍數,

是以兩個數的最小公倍數一定是它們的最大公因數的倍數;

那麼兩個數的公因數一定是兩個數的因數,兩個數的最小公倍數一定是這兩個數的倍數。是以兩個數的最小公倍數一定是他們因數的倍數。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6+7;
ll gcd(ll a,ll b)
{
    if(b==0) return a;
    return gcd(b,a%b);
}
set<ll> ans;
ll a,b;
int main()
{
    cin>>a>>b;
    ll g = gcd(a,b);
    for(ll i=1;i*i<=g;i++)
    {
        if(g%i==0)
        {
            ans.insert(i);
            ans.insert(g/i);
        }
    }
    for(auto it = ans.begin();it!=ans.end();++it)
    {
        cout<<*it<<" ";
    }
    return 0;
}      

連結:https://ac.nowcoder.com/acm/contest/280/D

題目描述

夕陽西下,匆匆忙忙間,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      

優先隊列優化的dijkstra模闆

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL inf=1e18+5;
const int maxn=10005;
int n,m,s,t,f,u,v,x,y,z;
vector<int> v1[maxn];
vector<LL> v2[maxn];
bool vis[maxn];LL w,dis[maxn];
priority_queue< pair<LL,int> > que;
void Dijkstra(){
    while(!que.empty())que.pop();
    memset(vis,false,sizeof(vis));
    dis[s]=0;que.push(make_pair(-dis[s],s));
    while(!que.empty()){
        x=que.top().second;que.pop();
        if(vis[x])continue;
        vis[x]=true;
        for(size_t j=0;j<v1[x].size();++j){
            y=v1[x][j],z=v2[x][j];
            if(!vis[y]&&(dis[x]+z<dis[y]))dis[y]=dis[x]+z,que.push(make_pair(-dis[y],y));
        }
    }
}
int main(){
    while(~scanf("%d%d%d%d",&n,&m,&s,&t)){
        for(int i=0;i<=n;++i)v1[i].clear(),v2[i].clear();
        for(int i=0;i<=n;++i)dis[i]=inf;
        while(m--){
            scanf("%d%d%d%lld",&f,&u,&v,&w);
            if(!f)continue;
            v1[u].push_back(v);
            v2[u].push_back(w);
            v1[v].push_back(u);
            v2[v].push_back(w);
        }
        Dijkstra();
        if(dis[t]==inf)puts("My gold!!!");
        else printf("%lld\n",dis[t]);
    }
    return 0;
}