• 牛客OI赛制测试赛1 题解


    数竞生:这不是送分的常识吗
    这里引入一个叫卡西尼恒等式的玩意。
    公式表达就是
    设$fib[i]$为斐波那契数列的第$i$项$(i>0,i in N_+)$
    则有
    $fib[i+1]fib[i-1]-fib[i]^2=(-1)^i$,其中$(i>1,i in N_+ )$
    因为数据说明了$i>=2$,所以我们可以用数学归纳法证明这个结论。
    首先看边界条件,
    $fib[1]=fib[2]=1,fib[3]=2$
    $fib[3]*fib[1]-fib[2]^2=2*1-1^2=(-1)^2$
    所以对于边界条件成立。
    现在,假设此结论对于$i=n$成立。
    则有$fib[n+1]fib[n-1]-fib[n]^2=(-1)^n$
    又∵$fib[i]=fib[i-1]+fib[i-2]$得出$fib[i+1]=fib[i]+fib[i-1]$
    所以有
    $fib[n+2]fib[n]-fib[n+1]^2$
    $=(fib[n+1]+fib[n])*fib[n]-(fib[n]+fib[n-1])^2$
    $=fib[n]^2+fib[n]fib[n+1]-fib[n]^2-fib[n-1]^2-2fib[n]fib[n-1]$
    $=fib[n]^2+fib[n](fib[n+1]-fib[n])-fib[n-1]^2-2fib[n]fib[n-1]$
    $=fib[n]^2+fib[n]fib[n-1]-2fib[n]fib[n-1]-fib[n-1]^2 $
    $=fib[n]^2-fib[n]fib[n-1]-fib[n-1]^2$
    $=fib[n]^2-fib[n-1](fib[n]+fib[n-1])$
    $=fib[n]^2-fib[n-1]fib[n+1]$
    $=(-1)(fib[n]^2-fib[n-1]fib[n+1])$
    $=(-1)(-1)^n$
    $=(-1)^{n+1}$
    所以,此结论对于$i=n+1$也成立$……$
    证毕。
    于是,$n$为偶数答案就是$1$否则为$-1$。高精读入,判断一下最后一位就行了。
    复杂度$O(1)$
    $code:$
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    char n[1000010];int l;int num;
    int main()
    {
        cin>>n;
        int l=strlen(n);
        num=n[l-1]-'0';
        printf("%d",num%2==0?1:-1);
        return 0;
    }
     
    实际上,如果不知道的话,直接打个表就能看出来了。
    下面是我比赛的时候打表的$generous$
     
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    long long f[100001];
    int main()
    {
     f[1]=f[2]=1;
     for(int i=2;i<=30;i++)
      f[i+1]=f[i]+f[i-1],
      printf("%lld ",f[i-1]*f[i+1]-f[i]*f[i]);
     return 0;
    }
    此题完结。
    恭喜本宝宝傻呵呵的就交上去代码了$qwq$
    然后才发现有错。
      
    #include<cstdio>
    #include<iostream> 
    using namespace std;
    int a,b,c;
     int main(){long long l=1,r=int(1e9)<<1:cin》a>>b;while(r-l>1){c=(l+r)>>1;if(c-b<a)l=c;else if(c-b>a)r=c;else return printf("%d
    ",c);
    }     if(l!=r)return printf("%d
    ",r);
         }
    不难发现,这里面又语法错误(拿个DEV试一下就知道了应该是两个,算上$return 0$三个)
    之后不难发现,是$a+bproblem$我自己手玩了好几组发现了。
    之后拿着$a+b$的正解拍了一万多组没出错。就认为是对的了。
    实际上,写过$a+b$毒瘤解法的小伙伴们都能一眼看出来。$a+b$交上去就过了。
    复杂度$O(1)$
     
    相信这题数据随机,所以一定是个暴力。
    首先看$q>>n$所以,想到一个记忆化,$ins[i]$表示询问$i$是否可行$-1,0,1$表示不可行,未知,可行。如果这个询问之前有过,直接输出就好,这样,我们把$q$降到了$100000$。
    之后,有一个显然的事情就是,当这个序列的所有元素和整除$k$的时候,才有可能满足。所以,如果$sum%k==0$暴力枚举即可过。
    这里在说一点,就是,如果$k$可行,则$d$一定可行,其中$d$是$k$的约数。这点显然,画个图就能理解。
    所以可以用莫队搞一发。按询问段数$k$从大到小暴力枚举,如果之前没被判过且当前可行,则可以把它的约数都标记为可行(这个对于小数据可能造成负优化,数据随机,所以不加这点可过)
    然后$……$考场上想了一个奇技淫巧的办法,只水了$40$
    复杂度:$O($玄学,能过$)$
    $qwq$
    不加优化理论一次$O(n)$,总共$q$次,因为加了记忆化,所以$n,q$同阶,最坏$O(nq)$,然而数据随机 $……$
    加优化更玄学$……$需要看数据而定,最坏的话应该能降到均摊根号左右。
     
    这题一开始叫CCF的巡查之旅呢 
    不难发现,给出的是一棵树。
    所以,我们直接找出树的直径之后再按等差数列求和公式计算即可。
    考场上树的直径写成$spfa$没救了$……$还写挂了,才拿了$18$分$qwq$
    所以就是树的直径的复杂度$O(n)$
    这题放到$E$题 真的很$……$不想说啥。
    青蛙走过的路线一定是一个子序列
    所以直接求一个最长不下降子序列就行。
    然后$nlogn$就过了
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int a[400005];
    int d[400005];
    int main()
    {
        int n;
        scanf("%d",&n);
        for (int i=1;i<=n;i++) scanf("%d",&a[i]);
        if (n==0)
        {
            printf("0
    ");
            return 0;
        }
        d[1]=a[1];
        int len=1;
        for (int i=2;i<=n;i++)
        {
            if (a[i]>=d[len]) d[++len]=a[i];
            else
            {
                int j=upper_bound(d+1,d+len+1,a[i])-d;
                d[j]=a[i];
            }
        }
        printf("%d
    ",len);   
        return 0;
    }
    容斥可做。首先算出不考虑去除数的子序列乘积的乘积$……$
    每一个数都被乘了$C_{n-1}^{k-1}$次,
    之后考虑第$i in 1,n $大的数我们对它多算的次数,
    为$C_{n-i}^{k-1}+C_{i-1}^{k-1}$次(就是从不选比$i$大的数中共$n-i+1$个数里选$k$个,和从不比$i$小的$i$数里选$k$个)
    所以容斥一发就好了。
    可以$nlogn$做.
  • 相关阅读:
    七-八章学习笔记
    Linux基础学习截图
    20191221第十章读书笔记
    第九章读书笔记
    20191221读书笔记
    缓冲区溢出
    团队作业(二):需求分析
    2019-2020-1 20191319 《信息安全专业导论》第十二周学习总结
    2019-2020-1 20191319 《信息安全专业导论》第十一周学习总结
    2019-2020-1 20191319 《信息安全专业导论》第十周学习总结
  • 原文地址:https://www.cnblogs.com/arcturus/p/9581031.html
Copyright © 2020-2023  润新知