题目链接:传送门
题意:
给定你三个数,p,q,n, p代表的是 a + b, q代表的是a*b;
然后求a^n + b^n
设f[i] = a^i +b^i;
f[0]=2,f[1]=p;
f[i]*(a+b) = a^(i+1) + b^(i+1) +a^i*b + b^i*a;
f[i]*p = f[i+1] + a*b*[ a^(i-1) + b^(i-1) ]
f[i+1] = f[i]*p + q*f[i-1];
然后用矩阵加速一下就可以了(ps.这个题的输入非常坑。。。。)
代码如下:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <set> #include <map> #include <queue> #define PB push_back #define MP make_pair #define REP(i,n) for(int i=0;i<(n);++i) #define FOR(i,l,h) for(int i=(l);i<=(h);++i) #define DWN(i,h,l) for(int i=(h);i>=(l);--i) #define IFOR(i,h,l,v) for(int i=(h);i<=(l);i+=(v)) #define CLR(vis) memset(vis,0,sizeof(vis)) #define MST(vis,pos) memset(vis,pos,sizeof(vis)) #define MAX3(a,b,c) max(a,max(b,c)) #define MAX4(a,b,c,d) max(max(a,b),max(c,d)) #define MIN3(a,b,c) min(a,min(b,c)) #define MIN4(a,b,c,d) min(min(a,b),min(c,d)) #define PI acos(-1.0) #define INF 1000000000 #define LINF 1000000000000000000LL #define eps 1e-8 #define LL long long using namespace std; const int maxn = 2; struct matrix{ LL a[maxn][maxn]; matrix operator *(matrix b){ matrix ans; REP(i,maxn){ REP(j,maxn){ ans.a[i][j]=0; REP(k,maxn) ans.a[i][j]+=a[i][k]*b.a[k][j]; } } return ans; } }; matrix I={1,0,0,1}; matrix pow(matrix A,LL k){ matrix ans = I; while(k){ if(k&1) ans=ans*A; k>>=1; A=A*A; } return ans ; } int main() { LL p,q,n; while(cin>>p>>q>>n){ if(n==0){puts("2");continue;} LL f0=2,f1=p; matrix A={p,-q,1,0}; matrix tmp = I*A; matrix ans = pow(A , n-1); cout<<ans.a[0][0]*f1+ans.a[0][1]*f0<<endl; } return 0; }
时间: 2024-11-07 19:30:41