小白月赛越来越不小白了,也可能是我越来越菜了
a题
Actci偶然发现了一个矿洞,这个矿洞的结构类似与一棵二叉树,Actci发现的矿洞恰好位于根节点处,为了尽快挖掘,Actci找来了她的小伙伴们来帮忙,由于地质原因,每天小伙伴们只能打通到一条到子节点的道路(不消耗时间),也就是说每天一个节点只能向一个子节点建设道路,走一条路需要一天的时间,当发现一条道路后,会有一部分小伙伴选择留下来继续勘测,假设小伙伴们有无数个,树的深度足够大,问第n天最多共建设几条道路。
思路 :打表或者画图 找规律 发现是斐波拉契数列求和。
#include <bits/stdc++.h> using namespace std; const long long mod=10000000007; long long f[5000005]; int main() { long long n; cin>>n; f[1]=1; f[2]=2; for(int i=3;i<=n;i++){ f[i]=f[i-1]+f[i-2]; f[i]=(f[i]+mod)%mod; } long long ans=0; for(int i=1;i<=n;i++) ans=(ans+f[i])%mod; cout<<ans<<endl; return 0; }
b题 也算是找规律吧
某年某月某天的数学课上,Actci正在遨游宇宙呢,对于他的屡教不改,她的数学老师决定难为一下Actci,将他叫醒。
“咳咳,我现在给出一个数a( 0≤a≤1010000),判断a是否是3,5,8,11中某些数的的倍数,你只有一秒钟的时间,答不上来的话,呵,%#W$%@#$@...”。
作为他后桌的你怎么能看着Actci“受害”呢,于是你决定帮帮他。
思路 :对于string的判断,如果被3整除的话,应该每位之和能被3整除,被5整除的话是末位能够被5整除,被8整除,要求个位十位百位所构成的数,能够被8整除,被11整除,是奇数位和偶数位之差能够被11整除
#include <bits/stdc++.h> using namespace std; int main() { int n,m; string s; cin>>s; int sum=0; int sum1=0,sum2=0; int flag=0; for(int i=0;i<s.length();i++){ if(i%2==0) sum1+=s[i]-'0'; else sum2+=s[i]-'0'; sum+=s[i]-'0'; } int t=0; int length=s.length(); t+=s[length-3]-'0'; t*=10; t+=s[length-2]-'0'; t*=10; t+=s[length-1]-'0'; int num[5]; if(sum%3==0) num[flag++]=3; if((s[s.length()-1]-'0')%5==0) num[flag++]=5; if(t%8==0) num[flag++]=8; if(abs(sum1-sum2)%11==0) num[flag++]=11; if(flag){ cout<<"Yes"<<endl; for(int i=0;i<flag;i++) cout<<num[i]<<' '; } else cout<<"No"<<endl; return 0; }
C题过的人挺多的,但是总感觉时间复杂度有点问题,数据爆int
Actci上课睡了一觉,下课屁颠屁颠的去找数学老师补课,问了老师一个题目:
给出两个数a,b,问a和b的全部公约数是什么?
数学老师一看这道题太简单了,不屑回答,于是就交给了你。对于100%的数据,1 ≤ a,b ≤ 10^13
思路: 就是先求出这两个数的gcd然后进行质因数分解。直接暴力莽就对了
#include <bits/stdc++.h> using namespace std; long long gcd(long long a,long long b){ return b==0?a:gcd(b,a%b); } int main() { long long n,m; cin>>n>>m; long long t=gcd(n,m); //long long s=(n/t)*m; set<long long> num; for(long long i=1;i*i<=t;i++){ if(t%i==0){ num.insert(i); num.insert(t/i); } } for(set<long long>::iterator it=num.begin() ;it!=num.end();it++) { cout<<*it<<' '; } return 0; }