给定a+1/a=n,求解a^m+1/a^m
一开始在原式上化简了半天,以为是直接求m次方之类的,无功而返,看了题解才发现神秘之处:
设f(x)=a^x+1/a^x,可以发现f(x)*f(y)=f(x+y)-f(x-y)
令y=1,可得:
f(x)*f(1)=f(x+1)+f(x-1)
即:f(x)=f(1)*f(x-1)-f(x-2)
接下来就是矩阵快速幂了,转移矩阵如下:
n -1
1 0
最坑的点是有-1,所以取余的时候一定得先加个mod
代码:
#include <bits/stdc++.h> #define int long long #define sc(a) scanf("%lld",&a) #define scc(a,b) scanf("%lld %lld",&a,&b) #define sccc(a,b,c) scanf("%lld %lld %lld",&a,&b,&c) #define schar(a) scanf("%c",&a) #define pr(a) printf("%lld",a) #define fo(i,a,b) for(int i=a;i<b;++i) #define re(i,a,b) for(int i=a;i<=b;++i) #define rfo(i,a,b) for(int i=a;i>b;--i) #define rre(i,a,b) for(int i=a;i>=b;--i) #define prn() printf("\n") #define prs() printf(" ") #define mkp make_pair #define pii pair<int,int> #define pub(a) push_back(a) #define pob() pop_back() #define puf(a) push_front(a) #define pof() pop_front() #define fst first #define snd second #define frt front() #define bak back() #define mem0(a) memset(a,0,sizeof(a)) #define memmx(a) memset(a,0x3f3f,sizeof(a)) #define memmn(a) memset(a,-0x3f3f,sizeof(a)) #define debug #define db double #define yyes cout<<"YES"<<endl; #define nno cout<<"NO"<<endl; using namespace std; typedef vector<int> vei; typedef vector<pii> vep; typedef map<int,int> mpii; typedef map<char,int> mpci; typedef map<string,int> mpsi; typedef deque<int> deqi; typedef deque<char> deqc; typedef priority_queue<int> mxpq; typedef priority_queue<int,vector<int>,greater<int> > mnpq; typedef priority_queue<pii> mxpqii; typedef priority_queue<pii,vector<pii>,greater<pii> > mnpqii; const int maxn=500005; const int inf=0x3f3f3f3f3f3f3f3f; const int MOD=1000000007; const db eps=1e-10; int qpow(int a,int b){int tmp=a%MOD,ans=1;while(b){if(b&1){ans*=tmp,ans%=MOD;}tmp*=tmp,tmp%=MOD,b>>=1;}return ans;} int lowbit(int x){return x&-x;} int max(int a,int b){return a>b?a:b;} int min(int a,int b){return a<b?a:b;} int mmax(int a,int b,int c){return max(a,max(b,c));} int mmin(int a,int b,int c){return min(a,min(b,c));} void mod(int &a){a+=MOD;a%=MOD;} bool chk(int now){} int half(int l,int r){while(l<=r){int m=(l+r)/2;if(chk(m))r=m-1;else l=m+1;}return l;} int ll(int p){return p<<1;} int rr(int p){return p<<1|1;} int mm(int l,int r){return (l+r)/2;} int lg(int x){if(x==0) return 1;return (int)log2(x)+1;} bool smleql(db a,db b){if(a<b||fabs(a-b)<=eps)return true;return false;} db len(db a,db b,db c,db d){return sqrt((a-c)*(a-c)+(b-d)*(b-d));} bool isp(int x){if(x==1)return false;if(x==2)return true;for(int i=2;i*i<=x;++i)if(x%i==0)return false;return true;} int n,m; struct mat{ int a[2][2]; mat(){mem0(a);a[0][0]=1;a[1][1]=1;} mat(int x,int b,int c,int d){ a[0][0]=x; a[0][1]=b; a[1][0]=c; a[1][1]=d; } }; mat mul(mat a,mat b){ mat tmp; mem0(tmp.a); fo(i,0,2){ fo(j,0,2){ fo(k,0,2){ tmp.a[i][j]+=((a.a[i][k]%MOD)*(b.a[k][j]%MOD))%MOD; tmp.a[i][j]+=MOD; tmp.a[i][j]%=MOD; } } } return tmp; } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0),cout.tie(0); cin>>n>>m; if(m==1) {cout<<n;return 0;} mat now(n%MOD,-1,1,0),ans; m-=1; while(m>0){ if(m&1) ans=mul(now,ans); now=mul(now,now); m>>=1; } int a=ans.a[0][0]%MOD,b=ans.a[0][1]%MOD; cout<<((n%MOD*a%MOD)%MOD+(2LL*b%MOD)%MOD)%MOD; return 0; } //15632475 21747465
原文:https://www.cnblogs.com/oneman233/p/11459333.html