uva 10655 - Contemplation! Algebra 【矩阵快速幂】【最坑的输入】

来源:互联网 发布:java md5加密32位小写 编辑:程序博客网 时间:2024/05/17 07:37



题意:令a*b = q, a+b = p,现在给你q、 p、 n,问你a^n + b^n的值。 


构造矩阵吧,比较简单。

但输入太坑爹了,上面说的是——Input is terminatedby a line containing only two zeroes.当输入一行只有两个0时结束,用while(scanf("%d%d", &p, &q), p || q)就悲剧了。


思路:((a-1)^n + (b-1)^n)  * (a + b) = a^n + b^n + ((a-2)^n+(b-2)^n) * a*b。

令f(n) = a^n + b^n,则有公式f(n) + f(n-2)*q = f(n-1)*p。

构造矩阵就可以KO了。


AC代码:


#include <cstdio>#include <cstring>#include <cmath>#include <cstdlib>#include <algorithm>#include <queue>#include <stack>#include <map>#include <set>#include <vector>#define INF 0x3f3f3f#define eps 1e-8#define MAXN (2000+1)#define MAXM (100000)#define Ri(a) scanf("%d", &a)#define Rl(a) scanf("%lld", &a)#define Rf(a) scanf("%lf", &a)#define Rs(a) scanf("%s", a)#define Pi(a) printf("%d\n", (a))#define Pf(a) printf("%.2lf\n", (a))#define Pl(a) printf("%lld\n", (a))#define Ps(a) printf("%s\n", (a))#define W(a) while(a--)#define CLR(a, b) memset(a, (b), sizeof(a))#define MOD 1000000007#define LL long long#define lson o<<1, l, mid#define rson o<<1|1, mid+1, r#define ll o<<1#define rr o<<1|1using namespace std;struct Matrix{    LL a[3][3];    int r, c;};Matrix ori, res;Matrix multi(Matrix x, Matrix y){    Matrix z; z.r = x.r; z.c = y.c;    CLR(z.a, 0);    for(int i = 0; i < x.r; i++)    {        for(int k = 0; k < x.c; k++)        {            if(x.a[i][k] == 0) continue;            for(int j = 0; j < y.c; j++)                z.a[i][j] += x.a[i][k] * y.a[k][j];        }    }    return z;}void init_M(LL p, LL q){    ori.r = ori.c = res.r = res.c = 2;    CLR(ori.a, 0); CLR(res.a, 0);    res.a[0][0] = res.a[1][1] = 1;    ori.a[0][0] = p; ori.a[0][1] = 1; ori.a[1][0] = -q;}LL F[3];void solve(LL n){    while(n > 0)    {        if(n & 1)            res = multi(ori, res);        ori = multi(ori, ori);        n >>= 1;    }    LL ans = F[0] * res.a[0][0] + F[1] * res.a[1][0];    Pl(ans);}int main(){    LL p, q, n;    while(scanf("%lld%lld%lld", &p, &q, &n) == 3)    {        F[0] = p; F[1] = 2;        if(n <= 1)        {            Pl(F[1-n]);            continue;        }        init_M(p, q); solve(n-1);    }    return 0;}


0 0
原创粉丝点击