小白劝退赛。
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( 0≤a≤10^10000),判断a是否是3,5,8,11中某些数的的倍数,你只有一秒钟的时间,答不上来的话,呵,%#W$%@#$@...”。
“咳咳,我现在给出一个数a( 0≤a≤10^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的全部公约数是什么?
数学老师一看这道题太简单了,不屑回答,于是就交给了你。
输入描述:
一行两个数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 }