http://acm.hdu.edu.cn/showproblem.php?pid=6395
给你A , B , C , D , P , n得值求Fn;
矩阵快速幂 构造矩阵
分块求
#include<stdio.h>
#include<string>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<math.h>
#include<map>
#define inf 0x3f3f3f3f
const long long mod=1e9+7;
using namespace std;
struct node
{
long long m[3][3];
};
node juzhen(node a,node b)
{
node aans;
memset(aans.m,0,sizeof(aans.m));
for(int i=0; i<3; i++)
for(int j=0; j<3; j++)
for(int k=0; k<3; k++)
{
aans.m[i][j]+=a.m[i][k]%mod*b.m[k][j]%mod;
aans.m[i][j]%=mod;
}
return aans;
}
node mul(node aa,long long n)
{
node aans,a=aa;
memset(aans.m,0,sizeof(aans.m));
for(int i=0; i<3; i++)
aans.m[i][i]=1;
while(n)
{
if(n%2)aans=juzhen(aans,a);
n/=2;
a=juzhen(a,a);
}
return aans;
}
node num;
long long a,b,c,d,p,n;
void init(long long x)//改变p/i的值
{
num= {d,c,x,
1,0,0,
0,0,1
};
}
int main()
{
int t;
scanf("%d",&t);
int r=0;
while(t--)
{
scanf("%I64d%I64d%I64d%I64d%I64d%I64d",&a,&b,&c,&d,&p,&n);
if(n==1)
printf("%I64d\n",a);
else if(n==2)
printf("%I64d\n",b);
else
{
node ans;
memset(ans.m,0,sizeof(ans.m));
for(int i=0; i<3; i++)
ans.m[i][i]=1;
long long m=min(n,p);
long long i,j;
for(i=3; i<=m; i=j+1)//p/i不能为0;
{
init(p/i);
j=p/(p/i);//分块
if(m<j)//如果不够一块(块指的是p/i值相等的区间)
ans=juzhen(mul(num,m-i+1),ans);
else
ans=juzhen(mul(num,j-i+1),ans);
}
long long s=2;
if(m<n)
{
long long rr=0;
init(rr);
ans=juzhen(mul(num,n-max(s,m)),ans);
}
node mmm=mul(num,n-max(s,m));
long long sum=0;;
sum+=b*ans.m[0][0]%mod;
sum+=a*ans.m[0][1]%mod;
sum+=ans.m[0][2]%mod;
printf("%I64d\n",sum%mod);
}
}
return 0;
}