結果
| 問題 |
No.1510 Simple Integral
|
| コンテスト | |
| ユーザー |
catupper
|
| 提出日時 | 2021-05-15 02:46:15 |
| 言語 | C++17(clang) (17.0.6 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,827 bytes |
| コンパイル時間 | 1,520 ms |
| コンパイル使用メモリ | 142,660 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-10-02 09:10:49 |
| 合計ジャッジ時間 | 3,048 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 13 WA * 30 |
ソースコード
#include <algorithm>
#include <cmath>
#include <complex>
#include <cstdio>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;
using Int = long long;
using Real = long double;
using CP = complex<Real>;
using P = pair<Int, Int>;
const Int MOD = 1000000007;
const Int MOD2 = 998244353;
const Int LINF = (1LL << 60);
const int INF = (1000000007);
const Real EPS = 1e-10;
const long double PI = 3.141592653589793238462643383279502884L;
Int modpow(Int a, Int b){
if(b == 0)return 1;
if(b % 2)return modpow(a, b-1) * a % MOD2;
auto half = modpow(a, b / 2);
return half * half % MOD2;
}
Int inv(Int x){
return modpow(x, MOD2 - 2);
}
int main()
{
Int n, a;
cin >> n;
map<Int, Int> cnt;
vector<Int> as;
for(int i = 0;i < n;i++){
cin >> a;
cnt[a]++;
as.push_back(a);
}
Int ans = 0;
for(auto [x, x_cnt]:cnt){
vector<Int> val(x_cnt, 0);
val[0] = 1;
for(auto a:as){
for(int i = x_cnt - 1;i >= 0;i--){
Int tmp = 0;
Int inv_x_a = inv(x+a);
Int prod = inv_x_a;
Int fact = 1;
for(int j = 0;i - j >= 0;j++){
(tmp += val[i-j] * prod % MOD2 * fact %MOD2 * ((j % 2 == 1) ? -1 : 1)) %= MOD2;
(prod *= inv_x_a) %= MOD2;
(fact *= (j+1))%=MOD2;
}
val[i] = tmp;
}
if(a != x){
for(int i = x_cnt - 1;i >= 0;i--){
Int tmp = 0;
Int inv_x_a = inv(x-a);
Int prod = inv_x_a;
Int fact = 1;
for(int j = 0;i - j >= 0;j++){
(tmp += val[i-j] * prod % MOD2 * fact %MOD2 * ((j % 2 == 1) ? -1 : 1)) %= MOD2;
(prod *= inv_x_a) %= MOD2;
(fact *= (j+1))%=MOD2;
}
val[i] = tmp;
}
}
}
(ans += val.back()) %= MOD2;
}
ans *= 2;
ans %= MOD2;
if(n % 2 == 0)ans = (MOD2 - ans) % MOD2;
cout << ans << endl;
return 0;
}
catupper