hdu 2817 a sequence of numbers

很水的一道题,数论做的很少。这题的输入是一个数列中的前三个数,然后根据输入判断是等差数列还是等比数列,然后求出第n项。囧,高中的公式就不写了~~

需要注意的地方是对结果取摸:A×B%M = ((A%M)*((B%M)%M)

最重要是求等比数列的时候: 求幂乘要用二分来乘,否则会TLE

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

#include <stdlib.h>
#include <string.h>
#define M 200907
long long a1,a2,a3;
long long d,n,an;
long long (long long x,long long a,long long n)
{
int i;
for (i = 0; (1LL<<i)<=n;i++)
{
if(n&(1LL<<i))
x = x*a%M;
a = a*a%M;
}
return x;
}
int main()
{
freopen("Sample Input.txt","r",stdin);
long long T;
scanf ("%I64d",&T);
while (T--)
{
scanf("%I64d%I64d%I64d%I64d",&a1,&a2,&a3,&n);
if ( (a2-a1)==(a3-a2) )
{
d = a2-a1;
an = (((a1%M+((n-1)%M)*(d%M)))%M)%M;
}
else
{
d = a2/a1%M;
an = cal(a1%M,d,n-1)%M;
}
printf("%I64dn",an);
}
getch();
return 0;
}