您的位置:首页 > 编程语言 > C语言/C++

C语言 - ACM题目:数列(等差或等比数列)

2013-12-08 00:08 232 查看
题目:
小明有天在做数学题,碰到这样一个问题,只告诉你一个数列的前三个数,并且这个数列一定是等差数列或等比数列中的一种,问你这个数列的第k个数是什么。现在请你编程帮小明解答这个问题。
输入格式:
输入的第一行是一个整数n,表示共有n组数列。
接下来n行,每行输入四个整数,前三个数表示数列的前三个数,第四个数就是题目描述中的k。
其中0<k<=10^9,其他三个数的范围为[0,2^63)。题目保证输入的数列为非降序的。
输出:
对于每组数列,输出数列中的第k个数模(%)200907后的结果。
输入样式:
2
1 2 3 5
1 2 4 5
输出样式:
5
16
#include <stdio.h>
int main()
{
int n, k, i,j, a[4];
scanf("%d", &n);

for(j=1;j<=n;j++)
{
for(i=0; i<4; i++)
scanf("%d", &a[i]);

if(a[1] / a[0] == a[2] / a[1])
{
k = a[1] / a[0];
for(i=0; i<a[3]-1; i++)
a[0] = a[0] * k;
}
else if(a[1] - a[0] == a[2] - a[1])
{
k = a[1] - a[0];
for(i=0; i<a[3]-1; i++)
a[0] = a[0] + k;
}

printf("%d\n", a[0]);
}

return 0;
}
// 标准答案
#include <stdio.h>
#define MOD 200907

long long g(long long q, long long k) {
long long sum = 1, a[1000], i = 0;
while (k) {
if (k % 2 != 0)
a[i++] = 1;
else
a[i++] = 0;
k /= 2;
}
i--;
for (i; i >= 0; i--) {
sum = (sum * sum) % MOD;
if (a[i])
sum = (sum * q) % MOD;
}
return sum % MOD;
}
int main() {
long long a, b, c, k, t, d, q;
int n;
scanf("%d", &n);
while (n--) {
scanf("%lld%lld%lld%lld", &a, &b, &c, &k);
if (b - a == c - b) {
d = b - a;
t = ((((k - 1) % MOD) * (d % MOD)) % MOD + a % MOD) % MOD;
printf("%lld\n", t);
} else {
q = b / a;
printf("%lld\n", (a % MOD * g(q, k - 1)) % MOD);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C语言 王吉平