Pagini recente » Cod sursa (job #2500769) | Cod sursa (job #1118708) | Rating Daria Stanescu (dariastanescu) | Istoria paginii arhiva | Cod sursa (job #2280645)
#include <iostream>
using namespace std;
ifstream fin("kfib.in");
ofstream fout("kfib.out");
int k;
void f_squared(int f[2][2])
{
int f1[2][2];
f1[0][0] = f[0][0] * f[0][0] + f[0][1] * f[1][0];
f1[0][1] = f[0][0] * f[0][1] + f[0][1] * f[1][1];
f1[1][0] = f[1][0] * f[0][0] + f[1][1] * f[1][0];
f1[1][1] = f[1][0] * f[0][1] + f[1][1] * f[1][1];
f[0][0] = f1[0][0];
f[0][1] = f1[0][1];
f[1][0] = f1[1][0];
f[1][1] = f1[1][1];
}
void f_multiply(int f[2][2],int x[2][2])
{
int f1[2][2];
f1[0][0] = f[0][0] * x[0][0] + f[0][1] * x[1][0];
f1[0][1] = f[0][0] * x[0][1] + f[0][1] * x[1][1];
f1[1][0] = f[1][0] * x[0][0] + f[1][1] * x[1][0];
f1[1][1] = f[1][0] * x[0][1] + f[1][1] * x[1][1];
f[0][0] = f1[0][0];
f[0][1] = f1[0][1];
f[1][0] = f1[1][0];
f[1][1] = f1[1][1];
}
int main()
{
fin>>k;
if(k==0)
fout<<0;
else
{
int f[2][2],p=1,a[2][2];
f[0][0] = 0;
f[0][1] = 1;
f[1][0] = 1;
f[1][1] = 1;
a[0][0] = 0;
a[0][1] = 1;
a[1][0] = 1;
a[1][1] = 1;
for(int i=2;i<=k;i=i*2)
f_squared(f),p=i;
for(int j=p+1;j<=k;j++)
f_multiply(f,a);
fout<<f[1][0];
}
return 0;
}