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,順序調整一下就能夠了。

相關文章
相關標籤/搜索