2022.1.29 训练日记 1 Acwing.1289. 序列的第k个数

题目链接:序列的第K个数

题目分析:
0.这是一个快速幂题目
1.答案情况如下:
	情况1:若a,b,c是一个等差数列,则第K项是a + (c - b) * (k - 1)
	情况2:若a,b,c是一个等比数列,则第K项是a * (b / a) ^ (k - 1) 用快速幂求解。
2.首先第一个问题:是否存在a,b,c,使得a,b,c既是一个等差数列,也是一个等比数列。
证明:
若a,b,c是一个等差数列,则a + c = 2b(1)
若a,b,c是一个等比数列,则a * c = b^2(2)
对(1)两边加平方得到(a + c)^2 = 4 * b^2(3)
联立(3)(4)可得(a - c)^2 = 0;
得证:当且仅当 a = b = c = 1 时该数列既是等差也是等比。
3.第二个问题:第二种情况中(b / a)有没有可能为分数。答案显而易见是不可能的。题中该序列为整数序列。所以如果公比为小数的话,最终也会成为小数,故公比必定为整数。

code:
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

typedef long long LL;

const int mod = 200907;
//快速幂模板 求a^b % mod 的结果 
LL qmi(LL a, int b, int mod)
{
    LL res = 1;
    while(b)
    {
        if(b & 1) res = (LL)res * a % mod;
        a = (LL)a * a % mod;
        b >>= 1;
    }
    return res;
}
int main()
{
    int T;
    cin >> T;

    while(T --)
    {
        int a, b, c, k;
        cin >> a >> b >> c >> k;
        if(a + c == 2 * b) cout << (a + (LL)(k - 1) * (b - a)) % mod << endl;//当取极限值的时候 会爆int 所以用long long
        else cout << (LL)a * qmi(b / a, k - 1, mod) % mod << endl;
    }

    return 0;
}

总结:
1.分析题目时要分析极限值判断是不是要用long long。
2.int ans = (long long) a * b * .......
	在C++语言中,两个数值执行运算时,以参与运算的最高数值类型为准。故,我们必须把其中一个数强制转换为64位整数类型 long long 参与运算,从而得到正确的结果。
  最终对mod取模之后,该结果会转换成int存回ans。
3.快速幂模板:
#include<iostream>
using namespace std;
const int mod = 2351512412;
//求快速a^b % mod的结果 时间复杂度O(log n)
int qmi(int a, int b)//也可以将mod以函数参数的形式传入。
{
	int res = 1;
	while(b)
	{
		if(b & 1) res = res * a % mod;//当res可能爆int的时候用long long
		a = a * a % mod;//当a可能爆int的时候用long long
		b >>= 1;
	}
	return res;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值