您的位置:首页 > 其它

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

2015-12-14 20:33 411 查看
题意:令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|1
using 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: