結果
問題 | No.1081 和の和 |
ユーザー |
![]() |
提出日時 | 2020-06-19 21:35:22 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 33 ms / 2,000 ms |
コード長 | 2,925 bytes |
コンパイル時間 | 1,335 ms |
コンパイル使用メモリ | 166,680 KB |
実行使用メモリ | 26,956 KB |
最終ジャッジ日時 | 2024-07-03 14:01:40 |
合計ジャッジ時間 | 2,282 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 8 |
ソースコード
#include<bits/stdc++.h>using namespace std;#define FOR(i,l,r) for(long long i=(l);i<(r);++i)#define REP(i,n) FOR(i,0,n)#define REPS(i,n) FOR(i,1,n+1)#define RFOR(i,l,r) for(long long i=(l);i>=(r);--i)#define RREP(i,n) RFOR(i,n-1,0)#define RREPS(i,n) RFOR(i,n,1)#define int long long#define mp make_pair#define pb push_back#define eb emplace_back#define SZ(x) ((int)(x).size())#define all(x) (x).begin(),(x).end()#define rall(x) (x).rbegin(),(x).rend()template<class T> inline bool chmin(T& a, T b) {if (a > b) {a = b; return true; }return false; }template<class T> inline bool chmax(T& a, T b) {if (a < b) {a = b; return true; }return false; }const int INF = 1e18;const int MOD = 1e9+7;// const int MOD = 998244353;const int MAX = 1000010;int fac[MAX],finv[MAX],inv[MAX];//テーブル作成void COMinit(){fac[0]=fac[1]=1;finv[0]=finv[1]=1;inv[1]=1;for(int i=2;i<MAX;i++){fac[i]=fac[i-1]*i%MOD;inv[i]=MOD-inv[MOD%i]*(MOD/i)%MOD;finv[i]=finv[i-1]*inv[i]%MOD;}}//nCkを求めるint COM(int n,int k){if(n<k)return 0;if(n<0||k<0)return 0;return fac[n]*(finv[k]*finv[n-k]%MOD)%MOD;}//ModInttemplate <typename T>T pow(T a, long long n, T e = 1) {T ret = e;while (n) {if (n & 1) ret *= a;a *= a;n >>= 1;}return ret;}template <int mod>struct ModInt {int x;ModInt() : x(0) {}ModInt(long long x_) {if ((x = x_ % mod + mod) >= mod) x -= mod;}ModInt& operator+=(ModInt rhs) {if ((x += rhs.x) >= mod) x -= mod;return *this;}ModInt& operator-=(ModInt rhs) {if ((x -= rhs.x) < 0) x += mod;return *this;}ModInt& operator*=(ModInt rhs) {x = (unsigned long long)x * rhs.x % mod;return *this;}ModInt& operator/=(ModInt rhs) {x = (unsigned long long)x * rhs.inv().x % mod;return *this;}ModInt operator-() const { return -x < 0 ? mod - x : -x; }ModInt operator+(ModInt rhs) const { return ModInt(*this) += rhs; }ModInt operator-(ModInt rhs) const { return ModInt(*this) -= rhs; }ModInt operator*(ModInt rhs) const { return ModInt(*this) *= rhs; }ModInt operator/(ModInt rhs) const { return ModInt(*this) /= rhs; }bool operator==(ModInt rhs) const { return x == rhs.x; }bool operator!=(ModInt rhs) const { return x != rhs.x; }ModInt inv() const { return pow(*this, mod - 2); }friend ostream& operator<<(ostream& s, ModInt<mod> a) {s << a.x;return s;}friend istream& operator>>(istream& s, ModInt<mod>& a) {s >> a.x;return s;}};using mint = ModInt<MOD>;signed main(){COMinit();int n; cin >> n;int sum = 0;REP(i,n){int a; cin >> a;sum += a * COM(n-1,i) % MOD;sum %= MOD;}cout << sum << endl;}