bzoj4870 Shoi2017 組合數問題

2022-05-01 06:18:11 字數 1242 閱讀 6484

time limit: 10 sec  memory limit: 512 mb

submit: 747  solved: 397

[submit][status][discuss]

第一行有四個整數 n, p, k, r,所有整數含義見問題描述。

1 ≤ n ≤ 10^9, 0 ≤ r < k ≤ 50, 2 ≤ p ≤ 2^30 − 1

一行乙個整數代表答案。

2 10007 2 0

8黑吉遼滬冀晉六省聯考

分析:一開始看上去根本不可做的一道題,換個思路想就能秒掉了......

75%的資料都是可以通過線性預處理逆元,字首逆元乘積和n!來計算的. 當n特別大的時候就gg了.

n這麼大,是讓我們化簡式子嗎? 應該是無法化簡的......換個角度想:從組合意義的角度來考慮這個式子,實際上就是求從nk個物品中取個數為i的物品的方案數,滿足條件:i % k == r.

因為有限制條件,所以不能直接用數學方法來推式子. 那麼剩下的求方案數的方法也就只有dp了.  狀態和轉移方程很好想:

令f[i][j]表示前i個物品中,選出的物品數 % k == j的方案數. 那麼f[i][j] = f[i-1][j] + f[i - 1][(j - 1 + k) % k]. (選或不選兩種選擇). n這麼大,狀態是儲存不下的. 因為i只與i-1有關,利用矩陣快速冪可以解決這一問題.  矩陣快速冪就是用來解決某一維特別大的轉移明確的遞推問題的.

有時候複雜的式子不能僅僅只是站在數學的角度去看待它。通過其表現的具體意義去看待它,說不定就能得到乙個好的解法.(尤其是組合式子!)

#include #include 

#include

#include

using

namespace

std;

typedef

long

long

ll;ll n,p,k,r;

struct

node

inline node

operator *(const node &b)

} ans,a,d;

void

qpow(ll b)

ans = ans *anss;

}int

main()

qpow(n *k);

printf(

"%lld\n

",ans.a[0

][r]);

return0;

}

Bzoj4870 SHOI2017 組合數問題

題目顯得一臉不可做。一般的來說,讀題是不會看前面一些沒有什麼太大意義的話的。確實也如此,譬如題面首句 組合數cm n 表示的是從n個互不相同的物品中選出m個的方案數 想來大家也是知道的 再觀察前面的式子 可以表示成如下形式 q modk rcq n k 回顧題面首句 代入?可以得到講人話的題面,大致...

bzoj4870 Shoi2017 組合數問題

這個題考慮組合數的實際意義,可以將題意轉化為從 nk 個數裡面選 m 個數 m k r 的方案數 這個可以 dp 求解 設 f i j 表示前 i 個數選出 j 個數 j 是對於 k 取mod後的 的方案數 顯然有 f i j f i 1 j f i 1 j 1 k k 可以發現 i 狀態之和 i ...

Bzoj3562 神器化合物 Shoi 2014

ac通道 分析 若把每乙個原子看作乙個節點,將化學鍵看作一條邊,那麼這個題目要求的 分子的個數 很容易就可以看出是求圖中聯通塊的個數。求聯通塊的個數,可以使用並查集。可如何求出每一步的聯通塊的個數呢?可以知道,當連上一條邊時,若此邊連線的是兩個不同的聯通塊,那麼分子個數就會減一 當刪去一條邊時,若刪...