牛客小白月赛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$%@#$@...”。
作为他后桌的你怎么能看着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 }

猜你喜欢

转载自www.cnblogs.com/acgoto/p/10163125.html
今日推荐