上一道题比这道难吧
题目很短,一目了然!!!
如下:
(a+sqrt(b))^n=xn+yn*sqrt(b)
很明显左式的结果一定可以表达为右式的形式,
例如:当 a=5, b=2,n=1 时, X1=5,Y1=1 , 当 n=2 时, X2=27,Y2=10
是不是很简单?已知 a,b,n 的值 , 你是否能求出 Xn, Yn 的值呢?
Input
输入只有一行,有三个整数分别为 a,b,n(1≤a,b,n≤12)的值,用空格分隔。
Output
输出两个整数占一行,用空格分隔,代表 Xn, Yn 的值。
Input
5 2 1
Output
5 1
解题思路:我写这道题的想法是找到每一项的x与y跟上一项的关系。
当 n = 1 时 左边的式子为(a + sqrt(b))
x = a, y = 1;
当 n = 2 时
实际就是将左边式子乘上一个 a + sqrt(b)
那么x的值就会变成a*a+sqrt(b)*sqrt(b),y的值就变成了a+a
再看一下 n = 3 .....
当我们观察一下每一次的x与y与上一次的x与y,我们可以发现
每一次的x值实际是上一次的x乘a加上一次的y乘b
(因为x是常数,所以每一次的x首先有一部分是上一次的常数乘a,
另一部分则来源于上一次的sqrt(b)乘sqrt(b)也就是上一次的y乘b)
而每一次的y则是上一次的y乘a加上一次的x的值)
(y为sqrt(b)的系数,所以一部分是上一次的sqrt(b)的系数y乘a,
另一部分则是上一次的常数x乘sqrt(b))
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
int main()
{
int a, b, n;
scanf("%d %d %d",&a, &b, &n);
long long int xx[15] = {0};
long long int yy[15] = {0};
xx[1] = a;
yy[1] = 1;
for(int i = 2; i <= n; i++)
{
xx[i] = xx[i-1] * a + yy[i - 1] * b;
yy[i] = yy[i - 1] * a + xx[i - 1];
}
printf("%lld %lld\n", xx[n], yy[n]);
}