牛客小白月賽10
阿新 • • 發佈:2018-12-23
小白勸退賽。
A.勘測
題目描述
Actci偶然發現了一個礦洞,這個礦洞的結構類似與一棵二叉樹,Actci發現的礦洞恰好位於根節點處,為了儘快挖掘,Actci找來了她的小夥伴們來幫忙,由於地質原因,每天小夥伴們只能打通到一條到子節點的道路(不消耗時間),也就是說每天一個節點只能向一個子節點建設道路,走一條路需要一天的時間,當發現一條道路後,會有一部分小夥伴選擇留下來繼續勘測,假設小夥伴們有無數個,樹的深度足夠大,問第n天最多共建設幾條道路。輸入描述:
一行,一個數n。
輸出描述:
一行,一個數表示最多建設的道路數,答案對 10000000007 取模。示例1
輸入
2
輸出
3
說明
樣例解釋:示例2
設n號點的子節點編號為n×2和n×2+1,根節點編號為1.
第一天1->2,在1,2處留有一部分人,道路數為1。
第二天1->3,2->4,在2,3,4處留有人,道路數為3.
輸入
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( 0≤a≤10^10000),判斷a是否是3,5,8,11中某些數的的倍數,你只有一秒鐘的時間,答不上來的話,呵,%#W$%@#[email protected]”。 作為他後桌的你怎麼能看著Actci“受害”呢,於是你決定幫幫他。
輸入描述:
一行,一個數 a。
輸出描述:
兩行。示例1
第一行輸出 Yes 或 No,表示這個數是否是這四個數中一個或幾個數的倍數。
第二行,a是哪些數的倍數,每個數用空格隔開(順序從小到大),若第一行為 No 則不用輸出。
輸入
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 }