結果
| 問題 |
No.995 タピオカオイシクナーレ
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2020-02-21 22:23:12 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 79 ms / 2,000 ms |
| コード長 | 2,689 bytes |
| コンパイル時間 | 1,760 ms |
| コンパイル使用メモリ | 160,276 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-10-08 22:51:03 |
| 合計ジャッジ時間 | 3,529 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 23 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define M 1000000007
template<int64_t MOD>
class ModInt {
int64_t value;
public:
// constructor
inline ModInt(int64_t val = 0) noexcept :
value((val >= MOD) ? (val % MOD) : (val < 0) ? ((val + MOD) % MOD) : val) {}
// プリミティブ整数型へのキャスト (型の明示:必要)
template<class Int>
explicit inline operator Int() const noexcept { return static_cast<Int>(value); }
inline ModInt inv() const noexcept {
return ModInt<MOD>::pow(value, MOD-2);
}
inline ModInt& operator+=(ModInt x) noexcept {
if ((value += x.value) >= MOD) value -= MOD;
return *this;
}
inline ModInt& operator-=(ModInt x) noexcept {
if ((value -= x.value) < 0) value += MOD;
return *this;
}
inline ModInt& operator*=(ModInt x) noexcept {
value = (value * x.value) % MOD; return *this;
}
inline ModInt& operator/=(ModInt x) noexcept {
value = (value * x.inv().value) % MOD; return *this;
}
inline ModInt operator+(ModInt x) const noexcept { return ModInt(*this) += x; }
inline ModInt operator-(ModInt x) const noexcept { return ModInt(*this) -= x; }
inline ModInt operator*(ModInt x) const noexcept { return ModInt(*this) *= x; }
inline ModInt operator/(ModInt x) const noexcept { return ModInt(*this) /= x; }
inline bool operator==(ModInt x) const noexcept { return value == x.value; }
inline bool operator!=(ModInt x) const noexcept { return !(this->operator==(x)); }
friend ostream& operator<<(ostream &os, ModInt x) noexcept { os << x.value; return os; }
friend istream& operator>>(istream &is, ModInt &x) noexcept { is >> x.value; return is; }
static constexpr inline ModInt pow(int64_t n, int64_t p) noexcept {
int64_t ret = 1;
for(; p > 0; p >>= 1) {
if (p & 1) ret = (ret * n) % MOD;
n = (n * n) % MOD;
}
return ret;
}
ModInt p(int64_t p){
int64_t n = value;
int64_t ret = 1;
for(; p > 0; p >>= 1) {
if (p & 1) ret = (ret * n) % MOD;
n = (n * n) % MOD;
}
return value = ret;
}
};
using mint = ModInt<M>;
mint p, q;
mint func(int64_t x){
mint tmp = 1;
tmp /= 2;
mint t2 = 1;
t2 -= p*2/q;
t2.p(x);
t2 += 1;
return tmp * t2;
}
signed main(){
int n, m;
cin >> n >> m;
int k;
cin >> k;
cin >> p >> q;
mint b[100010];
mint ans = 0;
for(int i = 0;i < n;i++){
cin >> b[i];
if(i < m){
ans += b[i] * func(k);
}else{
ans += b[i] * ((mint)(1) - func(k));
}
}
cout << ans << endl;
return 0;
}