BZOJ1867[Noi1999]钉子和小球

原题连接:钉子和小球 。php

先说DP:html

DP方程极为简单,若是这个地方有钉子,那么下一层的左右钉子分别继承1/2的几率,若是没有钉子,那么下下层的钉子继承该处所有几率便可。node

写出来是这样的:c++

if(a[i][j] == '*')
    a[i+1][j] += a[i][j] / 2,a[i+1][j+1] += a[i][j]/2;
else 
    a[i+2][j+1] += a[i][j];

当我美滋滋的写完,发现题目要求提交分数。函数

这还不简单,分母是2^n不就行了吗。
一键三连WA WA WA ~~~spa

分数结构体:c++11

因而我去找了题解,发现有一个叫作分数结构体的东西。用于处理分数计算。code

原题解连接htm

它的主要东西大概是这个:blog

struct node
{
    long long up, down;
    node(long long _up = 0, long long _dn = 1) : up(_up), down(_dn){};
    void reduction()
    {
        long long t = gcd(up, down);
        up /= t;
        down /= t;
    }
    void print()
    {
        cout << up << '/' << down;
    }
} f[MAXN][MAXN];
node operator*(node a, node b)
{
    node c = node(a.up * b.up, a.down * b.down);
    c.reduction();
    return c;
}
node operator+(node a, node b)
{
    long long t = gcd(a.down, b.down);
    node c = node(b.down / t * a.up + a.down / t * b.up, a.down / t * b.down);
    c.reduction();
    return c;
}

上面结构体里须要构造函数,不然计算时分母为0就崩了。

下面两个重载运算符。

在赋值的时候,要使用构造函数。否则编译不过去。(c++11是能够的可是BZOJ

一个小坑点:

最后交的时候一直TLE,直到最后发现是在分母相乘时,由于先写分母相乘再约分致使爆long long,顺序调整一下就能够了。

相关文章
相关标签/搜索