描述
喵哈哈村有个奇怪的石碑,上面浮现出了一个奇怪的问题:
有一数列{an},给出其前三项a1,a2,a3,以及要求的项的编号n,并且数列{an}只可能是等差数列或者是首项为1的等比数列,要求A输出第n项模100007后的值。
输入
一行,四个整数,a1,a2,a3,n。
满足:0< |a1|,|a2|,|a3|≤**105**,0<n<103。
本题包含若干组测试数据。
输出
一行,一个数,即an模100007的值。(负数取模答案为负)
样例输入1
1 2 3 5
样例输出1
5
样例输入2
1 2 4 4
样例输出2
8
A :
#include<bits/stdc++.h>
using namespace std;
const int mod = 1e5+7;
long long pow_mul(long long a, long long b){ // 快速幂
if (b == 0) return 1;
long long ans = pow(a, b/2);
ans = (ans * ans) % mod;
if (b & 1) return (ans * a) % mod;
return ans;
}
int main() {
long long a1, a2, a3, n, an = 1;
while (cin >> a1 >> a2 >> a3 >> n) {
if (a2 - a1 == a3 - a2) {
long long d = (a2 - a1);
an = (d * (n - 1) + a1) % mod;
} else {
long long q = (a2 / a1);
an = pow_mul(q, n-1) % mod; // 自带的pow函数遇到大数精度会丢失
}
cout << an << endl;
}
return 0;
}
数据范围是1e9的话,就要快速幂(分治法)
快速幂取模算法依赖的公式 :