这个题我一开始非要怼着 (a+b)^n不放推了老半天然并卵。。。。。。
可以酱紫:
(a^n+b^n)*(a+b)=a^(n+1)+b^(n+1)+a*b^n+b*a^n
得到:f(n+1)=f(n)*(a+b)-f(n-1)*a*b 然后矩阵快速幂
(怀疑人生中。。。。。。)
(我矩阵快速幂写的比较丑不要介意。。。)
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <ctime>
using namespace std;
typedef long long LL;
LL a[3][3];
void quick(LL n)
{
LL res[3][3],c[3][3];
res[0][0]=res[1][1]=1;
res[1][0]=res[0][1]=0;
while(n)
{
if(n&1)
{
c[0][0]=a[0][0]*res[0][0]+a[0][1]*res[1][0];
c[0][1]=a[0][0]*res[0][1]+a[0][1]*res[1][1];
c[1][0]=a[1][0]*res[0][0]+a[1][1]*res[1][0];
c[1][1]=a[1][0]*res[0][1]+a[1][1]*res[1][1];
for(int i=0;i<2;i++)for(int j=0;j<2;j++)res[i][j]=c[i][j];
}
c[0][0]=a[0][0]*a[0][0]+a[0][1]*a[1][0];
c[0][1]=a[0][0]*a[0][1]+a[0][1]*a[1][1];
c[1][0]=a[1][0]*a[0][0]+a[1][1]*a[1][0];
c[1][1]=a[1][0]*a[0][1]+a[1][1]*a[1][1];
for(int i=0;i<2;i++)for(int j=0;j<2;j++)a[i][j]=c[i][j];
n>>=1;
}
for(int i=0;i<2;i++)for(int j=0;j<2;j++)a[i][j]=res[i][j];
// for(int i=0;i<2;i++){for(int j=0;j<2;j++)printf("%lld ",res[i][j]);puts("");}
}
LL x,y,n;
int main()
{
// puts("A");
while(scanf("%lld%lld",&x,&y)!=-1)
{
char h=getchar();
if(x==0&&y==0&&h=='\n')break;
scanf("%lld",&n);
a[0][0]=x;
a[1][0]=-y;
a[0][1]=1;
a[1][1]=0;
if(n==1)
{
printf("%lld\n",x);
continue;
}
else if(n==2)
{
printf("%lld\n",x*x-2*y);
continue;
}
else if(n==0){printf("%lld\n",2);continue;}
quick(n-2);
LL f1=x,f2=x*x-2*y;
printf("%lld\n",f2*a[0][0]+f1*a[1][0]);
}
return 0;
}
本人蒟蒻,如有错误,还望指正