#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n=4,mod=1e9+7;
ll l,r,a[6]={0,3,1,1,1};
typedef struct jz{
ll m[6][6];
}jz;
jz mul(jz a,jz b){
jz c;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
c.m[i][j]=0;
for(int k=1;k<=n;k++)
c.m[i][j]=(c.m[i][j]+a.m[i][k]*b.m[k][j]%mod)%mod;
}
return c;
}
jz ksm(jz a,ll b){
jz ans;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
ans.m[i][j]=1*(i==j);
while(b){
if(b%2) ans=mul(ans,a);
a=mul(a,a);
b/=2;
}
return ans;
}
ll S(jz A,ll k){
if(k<3)
return k+1;
ll res=0;
jz B=ksm(A,k-2);
for(int i=1;i<=n;i++)
res=(res+B.m[1][i]*a[i]%mod)%mod;
return res;
}
int main(){
int T;
jz A,B;
while(~scanf("%lld%lld",&l,&r)){
if(r<3){
cout<<(r-l+1)<<endl;
continue;
}
memset(A.m,0,sizeof(A.m));
A.m[1][1]=1;A.m[1][2]=1;A.m[1][3]=1;A.m[1][4]=1;
A.m[2][2]=1;A.m[2][3]=1;A.m[2][4]=1;
A.m[3][2]=1;
A.m[4][3]=1;
ll res=S(A,r)-S(A,l-1);
printf("%lld\n",(res+mod)%mod);//这儿别忘了取余mod
}
return 0;
}
hdu2793前n项和
最新推荐文章于 2021-09-28 11:14:26 发布