问题链接:HDU2817 A sequence of numbers。
问题简述:(略)
问题分析:
这个问题是输入三个数,判断是等差数列还是等比数列,然后按照相应的数列进行计算,再做模除计算。
程序说明:
解决这个问题需要注意两点,一是计算模幂(套路);二是输入的数据需要使用long long类型。
计算模幂需要用二分法(快速模幂),以便加快计算速度。
AC的C语言程序如下:
/* HDU2817 A sequence of numbers */
#include
#define M 200907
// 模幂计算
long long powermod(long long a, long long n, int m)
{
long long res = 1L;
while(n) {
if(n & 1L) { // n % 2 == 1
res *= a;
res %= m;
}
a *= a;
a %= m;
n >>= 1;
}
return res;
}
int main(void)
{
int n;
long long a, b, c, si, k;
scanf("%d", &n);
while(n--) {
// 读入数据
scanf("%lld%lld%lld%lld", &a, &b, &c, &k);
// 判定数列类型
if(b-a == c-b) {
// 按照等差数列计算
int d = b - a;
si = (a + (k - 1)*d) % M;
} else {
int q = b / a;
si = (a * powermod(q, k-1, M)) % M;
}
// 输出结果
printf("%lld\n", si);
}
return 0;
}