\(n \le 2000, m \le 2000\)
直接利用遞推式預處理即可。
**如下
#include using namespace std;
const int mod = 1e9 + 7;
int main()
for (int i = 1; i <= 2000; i++)
} while (n--)
return 0;
}
\(n, m \le 1e5\)
預處理出階乘和階乘的逆元,利用組合數的定義直接回答。
#include using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int maxn = 1e5 + 10;
ll fpow(ll a, ll b)
} return ret;
}int main()
inv[1e5] = fpow(fac[1e5], mod - 2);
for (int i = 1e5 - 1; i >= 0; i--)
}; prework();
auto get = [&](int a, int b) ;
while (n--)
return 0;}/*
(a, b) = a! / ((a - b)! * b!)
a! = a * (a - 1)!
a!' * a = (a - 1)!'
*/
\(n, m \le 1e18, p \le 1e5,p \in prime\)
預處理出 \(1...p\) 的階乘和階乘的逆元,用盧卡斯定理進行回答。
**如下
#include using namespace std;
typedef long long ll;
ll fpow(ll a, ll b, ll c)
} return ret;
}int main()
inv[p - 1] = fpow(fac[p - 1], p - 2, p);
for (int i = p - 2; i >= 0; i--)
auto c = [&](ll x, ll y) -> ll
return fac[x] * inv[x - y] % p * inv[y] % p;
};functionlucas = [&](ll x, ll y) -> ll
return c(x % p, y % p) * lucas(x / p, y / p) % p;
};cout << lucas(a, b) << endl;
} return 0;
}
組合數取模
複習了一下組合數取模,當然推薦檢視acdreamer的部落格啦,寫的確實好啦,自己把裡面的題目全a掉了。include include include include include include include using namespace std typedef long long ll l...
組合數取模
對於c n,m mod p。這裡的n,m,p p為素數 都很大的情況。就不能再用c n,m c n 1,m c n 1,m 1 的公式遞推了。這裡用到lusac定理 for non negative integers m and n and a prime p,the following congr...
組合數取模
組合數c m,n 表示在m個不同的元素中取出n個元素 不要求有序 產生的方案數。定義式 c m,n m n m n 並不會使用latex qaq 根據題目中對組合數的需要,有不同的計算方法。運用乙個數學上的組合恒等式 oi中稱之為楊輝三角 c m,n c m 1,n 1 c m 1,n 證明 1.直...