lightoj1070 - Algebraic Problem(Matrix)

来源:互联网 发布:淘宝店铺过户条件 编辑:程序博客网 时间:2024/05/16 16:56

题目意思很显然,最后就是构造矩阵;

(a^n-1 + b^n-1)(a + b) = a^n + b^n + ab*(a^n-2 + b^n-2);

令f(n) = a^n + b^n;

有:f(n) = f(n-1)*(a+b) - ab*f(n-2);

特别的是膜2^64对无符号数而言就是自动溢出。。。

/*****************************************Author      :Crazy_AC(JamesQi)Time        :2016/4/26File Name   :*****************************************/// #pragma comment(linker, "/STACK:1024000000,1024000000")#include <iostream>#include <algorithm>#include <iomanip>#include <sstream>#include <string>#include <stack>#include <queue>#include <deque>#include <vector>#include <map>#include <set>#include <cstdio>#include <cstring>#include <cmath>#include <cstdlib>#include <climits>using namespace std;#define MEM(x,y) memset(x, y,sizeof x)#define pk push_back#define lson rt << 1#define rson rt << 1 | 1#define bug cout << "BUG HERE\n"typedef long long LL;typedef unsigned long long ULL;typedef pair<int,int> ii;typedef pair<ii,int> iii;const double eps = 1e-8;const int inf = 1 << 30;const int INF = 0x3f3f3f3f;//const ULL MOD = 1ull << 64;int nCase = 0;typedef struct Matrix{    unsigned long long a[3][3];}Matrix;Matrix mul(Matrix A, Matrix B){    Matrix tmp;    for (int i = 1;i <= 2;++i)    {        for (int j = 1;j <= 2;++j)        {            unsigned long long t = 0;            for (int k = 1;k <= 2;++k)                t = (t + A.a[i][k]*B.a[k][j]) ;            tmp.a[i][j] = t;        }    }    return tmp;}void Quick(Matrix org, Matrix& ans,ULL n) {    while(n) {        if (n & 1) ans = mul(org, ans);        n >>= 1;        org = mul(org, org);    }}int main(){    //freopen("in.txt","r",stdin);    //frepoen("out.txt","w",stdout);    int t;    cin >> t;    while(t--) {        ULL n, p, q;        scanf("%llu%llu%llu", &p, &q, &n);        Matrix org, ans;        memset(ans.a, 0,sizeof ans.a);        org.a[1][1] = p;        org.a[1][2] = -q;        org.a[2][1] = 1;        org.a[2][2] = 0;        ans.a[1][1] = p*p - 2*q;        ans.a[2][1] = p;        printf("Case %d: ", ++nCase);        if (n == 0) {            printf("%d\n",2);        }else if (n == 1) {            printf("%llu\n", p);        }else {            Quick(org, ans, n - 2);            printf("%llu\n", ans.a[1][1]);        }    }    return 0;}


0 0