tjut 3509

#include <cstdio>  
#include <iostream>  
#include <cstring>  
  
using namespace std;  
typedef long long LL;  
  
const int N=55;  
LL x[N][N],y[N][N],s[N][N];  
LL A[N],B[N],F1[N],F2[N],tmp;  
int f1,f2,a,b,K,n,m;  
int i,j,k,t;  
  
void mul(LL x[N][N],LL y[N][N])  
{  
    int i,j,k;  
    for(i=0; i<K+2; ++i)  
    {  
        for(j=0; j<K+2; ++j)  
        {  
            for(s[i][j]=k=0; k<K+2; ++k)  
                s[i][j]+=x[i][k]*y[k][j]%m;  
            s[i][j]%=m;  
        }  
    }  
    for(i=0; i<K+2; ++i)  
        for(j=0; j<K+2; ++j)  
            x[i][j]=s[i][j];  
}  
  
int main()  
{  
    cin>>t;  
    while(t--)  
    {  
        cin>>f1>>f2>>a>>b>>K>>n>>m;  
        A[0]=B[0]=F1[0]=F2[0]=1;  
        for(i=1; i<K+2; ++i)  
        {  
            A[i]=A[i-1]*a%m;  
            B[i]=B[i-1]*b%m;  
            F1[i]=F1[i-1]*f1%m;  
            F2[i]=F2[i-1]*f2%m;  
        }  
        memset(x,0,sizeof(x));  
        memset(y,0,sizeof(y));  
        for(i=0; i<K+2; ++i)x[i][i]=1;  
        y[0][0]=y[0][1]=1;  
        for(i=1; i<K+2; ++i)  
        {  
            for(j=1,tmp=1,k=K-i+2; k--; ++j)  
            {  
                y[i][j]=(tmp%m)*A[k]%m;  
                y[i][j]=(y[i][j]*B[j-1])%m;  
                tmp*=k;  
                tmp/=j;  
            }  
        }  
        --n;  
        while(n)  
        {  
            if(n&1)mul(x,y);  
            mul(y,y);  
            n>>=1;  
        }  
        tmp=F1[K]*x[0][0]%m;  
        for(i=1; i<K+2; ++i)  
        {  
            tmp+=((F2[K-i+1]*F1[i-1])%m)*x[0][i];  
            tmp%=m;  
        }  
        cout<<tmp<<endl;  
    }  
    return 0;  
}  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值