• AcWing 1289. 序列的第k个数


    题目传送门

    一、疑问:能不能一个数列,即是等差数列又是等比数列?

    结论:一个数列如果是即是等差又是等比,那么它必然是一个全等数列
    证明:
    设三个连续数字\(a\ b \ c\),
    等差数列,所以\(a+c=2b\)
    等比数列,所以\(\frac{b}{a}=\frac{c}{b}\),所以\(b^2=ac\)

    \(a=2b-c\)代入②
    \(b^2=(2b-c)*c\)
    \(b^2=2bc-c^2\)
    \(b^2-2bc+c^2=0\)
    \((b-c)^2=0\)
    \(b=c\)

    由此可知,题目中给了数列的前三项,存在可能即是等差又是等比的情况,但,此时就是一个全等数列,按哪个规则进行计算都是一样的结果,题目不缺少条件。

    二、题意分析

    • 等差数列
      公差\(d=b-a\)
      \(k\)项,应该是\(a+(k-1)d\),这个很好求,直接求然后注意取模就行了。

    • 等比数列
      公比\(p=\frac{b}{a}\)
      \(k\)项,应该是\(a*p^{k-1}=a*(\frac{b}{a})^{k-1}\)

    三、实现代码

    #include <bits/stdc++.h>
    using namespace std;
    
    //快速幂
    typedef long long LL;
    const int mod = 200907;
    int qmi(int a, int k) {
        int res = 1;
        while (k) {
            if (k & 1) res = (LL)res * a % mod;
            a = (LL)a * a % mod;
            k >>= 1;
        }
        return res;
    }
    
    int main() {
        int n;
        scanf("%d", &n);
        while (n--) {
            int a, b, c, k;
            scanf("%d%d%d%d", &a, &b, &c, &k);
            if (a + c == b * 2) //等差
                printf("%lld\n", (a + (b - a) * (LL)(k - 1)) % mod);
            else //等比
                printf("%lld\n", (LL)a * qmi(b / a, k - 1) % mod);
        }
    
        return 0;
    }
    
  • 相关阅读:
    【BZOJ 1370】 团伙
    【BZOJ 1590】 Secret Message
    【BZOJ 2288】 生日礼物
    【POJ 3630】 Phone List
    【BZOJ 1398】 Necklace
    platform驱动之probe函数
    linux输入子系统之按键驱动
    linux输入子系统概念介绍
    操盘策略:KDJ三线合一 必定孕育大牛股
    nandflash裸机程序分析
  • 原文地址:https://www.cnblogs.com/littlehb/p/16284404.html
Copyright © 2020-2023  润新知