您的位置:首页 > 理论基础 > 数据结构算法

数列的第k个元素-快速幂

2017-04-21 18:32 190 查看
问题 E:
数列3

时间限制: 1 Sec  内存限制: 32 MB
提交: 51  解决: 8

[提交][状态][讨论版]
题目描述
小明有天在做数学题,碰到这样一个问题,只告诉你一个数列的前三个数,并且这个数列一定是等差数列或等比数列中的一种,问你这个数列的第k个数是什么。现在请你编程帮小明解答这个问题。
输入
输入的第一行是一个整数n,表示共有n组数列。
接下来n行,每行输入四个整数,前三个数表示数列的前三个数,第四个数就是题目描述中的k。
其中0<k<=10^9,其他三个数的范围为[0,2^63)。题目保证输入的数列为非降序的。
输出
对于每组数列,输出数列中的第k个数模(%)200907后的结果。
样例输入
2
1 2 3 5
1 2 4 5
样例输出
5

1.      题意分析:告诉你一个数列的前三个数,并且这个数列一定是等差数列或等比数列中的一种,问你这个数列的第k个数是什么。并且第k个数要对200907取余;

2.      题目类型:快速幂

3.      解题思路:判断如果是等差数列先把公差对200907求余,最后用等差数列公式算到k在求余;如果是等比数列就用快速幂算到k,每次求余;

#include <stdio.h>

int main()
{
long long sum,t, a, b, c, k, d, q;

scanf("%lld", &t);
while(t--)
{
scanf("%lld %lld %lld %lld", &a, &b,&c,&k);
if(b-a == c-b)
{
d = (b-a);

sum = a+d*(k-1);
sum %= 200907;

}
else
{
q = c/b;
q %= 200907;
k--;
for(sum=a%200907; k; k/=2)
{
if(k % 2)
sum *= q;
q *= q;
q %= 200907;
sum %= 200907;
}
}
printf("%lld\n", sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息