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