小白月赛越来越不小白了,也可能是我越来越菜了

   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( 0a1010000),判断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;
}