1. 程式人生 > >牛客小白月賽10

牛客小白月賽10

小白勸退賽。

A.勘測

題目描述

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×10^6。

解題思路:找規律-->斐波那契數列。注意題目的空間限制,剛開始開兩個陣列,然後就一直提示編譯錯誤,最後改用幾個變數搓搓公式即可。

AC程式碼:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 const LL mod=10000000007;
 5 LL ans,pre1,pre2,now;int n;
 6 int main(){
 7     while(cin>>n){
 8         ans=1
,pre1=1,pre2=1; 9 for(int i=2;i<=n;++i){ 10 now=(pre1+pre2)%mod; 11 ans=(ans+now)%mod; 12 pre1=pre2,pre2=now; 13 } 14 cout<<ans<<endl; 15 } 16 return 0; 17 }

B.數學

題目描述

某年某月某天的數學課上,Actci正在遨遊宇宙呢,對於他的屢教不改,她的數學老師決定難為一下Actci,將他叫醒。
“咳咳,我現在給出一個數a( 0a10^10000),判斷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

解題思路:常規做法,只需單獨驗證4個數字即可,水過。

AC程式碼:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 const int maxn=10005;
 5 string str;bool flag,f[5];int ans,mou[4]={3,5,8,11},arr[maxn],siz;vector<int> vec;
 6 int main(){
 7     while(cin>>str){
 8         memset(f,false,sizeof(f)),flag=false;vec.clear();
 9         for(int i=0;str[i];++i)arr[i]=str[i]-'0';
10         for(int j=0;j<4;++j){
11             ans=0;
12             for(int i=0;str[i];++i)ans=(ans*10+arr[i])%mou[j];
13             if(!ans)flag=true,f[j]=true;
14         }
15         if(!flag){puts("No");continue;}
16         puts("Yes");
17         for(int i=0;i<4;++i)
18             if(f[i])vec.push_back(mou[i]);
19         siz=vec.size();
20         for(int i=0;i<siz;++i)
21             cout<<vec[i]<<(i==siz-1?'\n':' ');
22     }
23     return 0;
24 }

C.約數

題目描述

Actci上課睡了一覺,下課屁顛屁顛的去找數學老師補課,問了老師一個題目:
    給出兩個數a,b,問a和b的全部公約數是什麼?
數學老師一看這道題太簡單了,不屑回答,於是就交給了你。

輸入描述:

一行兩個數a,b.

輸出描述:

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

輸入

25 37

輸出

1
示例2

輸入

25 100

輸出

1 5 25

備註:

對於100%的資料,1 ≤ a,b ≤ 10^13

解題思路:先用sqrt(a)(a<=b)的時間求出a的所有因子,然後列舉其所有因子,看是否為b的因子即可。

AC程式碼:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 LL a,b;vector<LL> vec1,vec2;int szt;
 5 int main(){
 6     while(cin>>a>>b){
 7         if(a>b)swap(a,b);
 8         vec1.clear(),vec2.clear();
 9         for(LL i=1;i*i<=a;++i){
10             if(i*i==a)vec1.push_back(i);
11             else if(a%i==0)vec1.push_back(i),vec1.push_back(a/i);
12         }
13         for(size_t i=0;i<vec1.size();++i)
14             if(b%vec1[i]==0)vec2.push_back(vec1[i]);
15         sort(vec2.begin(),vec2.end()),szt=vec2.size();
16         for(int i=0;i<szt;++i)
17             cout<<vec2[i]<<(i==szt-1?'\n':' ');
18     }
19     return 0;
20 }