【矩阵快速幂】LightOJ_1070_Algebraic Problem

来源:互联网 发布:ubuntu win7双系统 编辑:程序博客网 时间:2024/06/04 18:29

Given the value of a+b and ab you will have to find the value of an+bna and b not necessarily have to be real numbers.

Input

Input starts with an integer T (≤ 10000), denoting the number of test cases.

Each case contains three non-negative integers, p, q and n. Here p denotes the value of a+b and qdenotes the value of ab. Each number in the input file fits in a signed 32-bit integer. There will be no such input so that you have to find the value of 00.

Output

For each test case, print the case number and (an+bn) modulo 264.

Sample Input

2

10 16 2

7 12 3

Sample Output

Case 1: 68

Case 2: 91

/*unsigned long long 自动对2^64取模*/#include <bits/stdc++.h>using namespace std;typedef unsigned long long ULL;const int maxn=2;typedef struct node{    ULL a[maxn][maxn];    node(){        memset(a,0,sizeof(a));    }}Matrix;Matrix multiply(Matrix x,Matrix y){    Matrix ans;    for(int i=0;i<maxn;i++){        for(int j=0;j<maxn;j++){            for(int k=0;k<maxn;k++){                ans.a[i][j]+=x.a[i][k]*y.a[k][j];            }        }    }    return ans;}Matrix quickpow(Matrix x,int a){    Matrix ans;    for(int i=0;i<maxn;i++)        ans.a[i][i]=1;    while(a){        if(a&1)            ans=multiply(ans,x);        x=multiply(x,x);        a>>=1;    }    return ans;}int main(){    int t,n;    ULL p,q;    scanf("%d",&t);    for(int cas=1;cas<=t;cas++){        scanf("%llu%llu%d",&p,&q,&n);        if(n<3){            if(n==0) printf("Case %d: %llu\n",cas,2);            if(n==1) printf("Case %d: %llu\n",cas,p);            if(n==2) printf("Case %d: %llu\n",cas,p*p-2*q);            continue;        }        Matrix base,x;        x.a[0][0]=p;x.a[0][1]=1;x.a[1][0]=-q;x.a[1][1]=0;        base.a[0][0]=p*p-2*q;base.a[0][1]=p;        Matrix ans=multiply(base,quickpow(x,n-2));        printf("Case %d: %llu\n",cas,ans.a[0][0]);    }}

原创粉丝点击