結果
問題 | No.1127 変形パスカルの三角形 |
ユーザー |
![]() |
提出日時 | 2020-07-28 21:33:26 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 128 ms / 1,500 ms |
コード長 | 3,050 bytes |
コンパイル時間 | 1,971 ms |
コンパイル使用メモリ | 161,196 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-06-28 20:56:51 |
合計ジャッジ時間 | 4,763 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 30 |
ソースコード
/*** @FileName a.cpp* @Author kanpurin* @Created 2020.07.28 21:33:20**/#include "bits/stdc++.h"using namespace std;typedef long long ll;int MOD = 1e9 + 7;struct mint {private:long long x;public:mint(long long x = 0) :x((MOD+x)%MOD) {}mint(std::string &s) {long long z = 0;for (int i = 0; i < s.size(); i++) {z *= 10;z += s[i] - '0';z %= MOD;}this->x = z;}mint& operator+=(const mint &a) {if ((x += a.x) >= MOD) x -= MOD;return *this;}mint& operator-=(const mint &a) {if ((x += MOD - a.x) >= MOD) x -= MOD;return *this;}mint& operator*=(const mint &a) {(x *= a.x) %= MOD;return *this;}mint& operator/=(const mint &a) {long long n = MOD - 2;mint u = 1, b = a;while (n > 0) {if (n & 1) {u *= b;}b *= b;n >>= 1;}return *this *= u;}mint operator+(const mint &a) const {mint res(*this);return res += a;}mint operator-(const mint &a) const {mint res(*this);return res -= a;}mint operator*(const mint &a) const {mint res(*this);return res *= a;}mint operator/(const mint &a) const {mint res(*this);return res /= a;}friend std::ostream& operator<<(std::ostream &os, const mint &n) {return os << n.x;}bool operator==(const mint &a) const {return this->x == a.x;}};long long powMod(long long k, long long n, long long mod) {long long x = 1;while (n > 0) {if (n & 1) {x = x * k % mod;}k = k * k % mod;n >>= 1;}return x;}long long comb(ll n, ll r, ll mod) {long long ret = 1;while (true) {if (r == 0) break;long long N = n % mod;long long R = r % mod;if (N < R) return 0;for (int i = 0; i < R; i++){ret = ret * (N - i) % mod;}long long imul = 1;for (int i = 0; i < R; i++){imul = imul * (i + 1) % mod;}ret = ret * powMod(imul, mod - 2, mod) % mod;n /= mod; r /= mod;}return ret;}int main() {ll a, b;cin >> a >> b;ll n, k;cin >> n >> k;a %= MOD;b %= MOD;if (k == 1) {cout << a << endl;}else if (k == n + 1) {cout << b << endl;}else {cout << ((comb(n - 1, k - 1,MOD) * a) % MOD + (comb(n - 1, k - 2,MOD) * b) % MOD) % MOD << endl;}mint ans = 0;mint c = 1;vector< mint > p(n + 1,0);p[0] = a;p[n] = b;for (int i = 1; i < n; i++) {c *= n - i;c /= i;p[i] += c * a;p[n - i] += c * b;}for (int i = 0; i <= n; i++) {ans += p[i] * p[i];}cout << ans << endl;return 0;}