小白劝退赛。
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 }
D.饥饿
题目描述
夕阳西下,匆匆忙忙间,SSJ一天的课程已经全部上完了,肚子咕咕开始叫了,坐上回家的公交车,可是SSJ今天好像有点迷,据说今中午吃饭时没去食堂,走着走着,外边景色好美啊,啊?我好像没走过这,完了,我好想迷路了。
公交车到了终点站,SSJ下车了,内心无比紧张,回不去了,一阵冷风吹过,瑟瑟发抖,emm...,那是一张地图?地图上有啥大家都明白,SSJ现在已经饿得无力思考了,请你帮他设计一条最快回家的路下,他要快点回家吃xxx。
公交车到了终点站,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
解题思路:最短路,vector建边存图,套个堆优化的迪杰斯特拉算法模板即可。
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 const LL inf=1e18+5; 5 const int maxn=10005; 6 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]; 7 priority_queue< pair<LL,int> > que; 8 void Dijkstra(){ 9 while(!que.empty())que.pop(); 10 memset(vis,false,sizeof(vis)); 11 dis[s]=0;que.push(make_pair(-dis[s],s)); 12 while(!que.empty()){ 13 x=que.top().second;que.pop(); 14 if(vis[x])continue; 15 vis[x]=true; 16 for(size_t j=0;j<v1[x].size();++j){ 17 y=v1[x][j],z=v2[x][j]; 18 if(!vis[y]&&(dis[x]+z<dis[y]))dis[y]=dis[x]+z,que.push(make_pair(-dis[y],y)); 19 } 20 } 21 } 22 int main(){ 23 while(~scanf("%d%d%d%d",&n,&m,&s,&t)){ 24 for(int i=0;i<=n;++i)v1[i].clear(),v2[i].clear(); 25 for(int i=0;i<=n;++i)dis[i]=inf; 26 while(m--){ 27 scanf("%d%d%d%lld",&f,&u,&v,&w); 28 if(!f)continue; 29 v1[u].push_back(v);///建图:双向边 30 v2[u].push_back(w); 31 v1[v].push_back(u); 32 v2[v].push_back(w); 33 } 34 Dijkstra(); 35 if(dis[t]==inf)puts("My gold!!!"); 36 else printf("%lld\n",dis[t]); 37 } 38 return 0; 39 }