結果
問題 | No.856 増える演算 |
ユーザー |
👑 |
提出日時 | 2019-07-26 22:44:26 |
言語 | D (dmd 2.109.1) |
結果 |
WA
|
実行時間 | - |
コード長 | 4,379 bytes |
コンパイル時間 | 2,443 ms |
コンパイル使用メモリ | 179,276 KB |
実行使用メモリ | 34,948 KB |
最終ジャッジ日時 | 2024-06-22 02:05:20 |
合計ジャッジ時間 | 21,051 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 79 WA * 1 |
コンパイルメッセージ
Complex!real[] Main.d(143): Deprecation: function `std.math.exponential.log` is deprecated - `std.math.exponential.log` called with argument types `(long)` matches both `log(real)`, `log(double)`, and `log(float)`. Cast argument to floating point type instead. Main.d(143): Deprecation: function `std.math.exponential.log` is deprecated - `std.math.exponential.log` called with argument types `(long)` matches both `log(real)`, `log(double)`, and `log(float)`. Cast argument to floating point type instead.
ソースコード
import std.conv, std.functional, std.range, std.stdio, std.string;import std.algorithm, std.array, std.bigint, std.complex, std.container, std.math, std.numeric, std.regex, std.typecons;import core.bitop;class EOFException : Throwable { this() { super("EOF"); } }string[] tokens;string readToken() { for (; tokens.empty; ) { if (stdin.eof) { throw new EOFException; } tokens = readln.split; } auto token = tokens.front; tokens.popFront; return token; }int readInt() { return readToken.to!int; }long readLong() { return readToken.to!long; }real readReal() { return readToken.to!real; }bool chmin(T)(ref T t, in T f) { if (t > f) { t = f; return true; } else { return false; } }bool chmax(T)(ref T t, in T f) { if (t < f) { t = f; return true; } else { return false; } }int binarySearch(alias pred, T)(in T[] as) { int lo = -1, hi = cast(int)(as.length); for (; lo + 1 < hi; ) { const mid = (lo + hi) >> 1;(unaryFun!pred(as[mid]) ? hi : lo) = mid; } return hi; }int lowerBound(T)(in T[] as, T val) { return as.binarySearch!(a => (a >= val)); }int upperBound(T)(in T[] as, T val) { return as.binarySearch!(a => (a > val)); }struct ModInt(long M) {long x;this(in ModInt a) { x = a.x; }this(in long a) { x = a % M; if (x < 0) x += M; }ref ModInt opAssign(in long a) { return this = ModInt(a); }ref ModInt opOpAssign(string op)(in ModInt a) {static if (op == "+") { x += a.x; if (x >= M) x -= M; }else static if (op == "-") { x -= a.x; if (x < 0) x += M; }else static if (op == "*") { x *= a.x; x %= M; }else static assert(false);return this;}ref ModInt opOpAssign(string op)(in long a) { return mixin("this " ~ op ~ "= ModInt(a)"); }ModInt opUnary(string op)() const if (op == "-") { return ModInt(-x); }ModInt opBinary(string op, T)(in T a) const { return mixin("ModInt(this) " ~ op ~ "= a"); }ModInt opBinaryRight(string op)(in long a) const { return mixin("ModInt(a) " ~ op ~ "= this"); }string toString() const { return x.to!string; }}// a^-1 (mod m)long modInv(long a, long m)in {assert(m > 0, "modInv: m > 0 must hold");}do {long b = m, x = 1, y = 0, t;for (; ; ) {t = a / b;a -= t * b;if (a == 0) {assert(b == 1 || b == -1, "modInv: gcd(a, m) != 1");if (b == -1) {y = -y;}return (y < 0) ? (y + m) : y;}x -= t * y;t = b / a;b -= t * a;if (b == 0) {assert(a == 1 || a == -1, "modInv: gcd(a, m) != 1");if (a == -1) {x = -x;}return (x < 0) ? (x + m) : x;}y -= t * x;}}enum long MO = 1000000007;alias Mint = ModInt!MO;Mint power(Mint a, long e) {Mint x = a, y = 1;for (; e; e >>= 1) {if (e & 1) y *= x;x *= x;}return y;}enum L = 2^^18;int N;long[] A;void main() {auto fft = new Fft(L);try {for (; ; ) {N = readInt();A = new long[N];foreach (i; 0 .. N) {A[i] = readInt();}auto f = new real[L];f[] = 0.0;foreach (i; 0 .. N) {f[cast(int)(A[i])] += 1;}auto ff = fft.fft!real(f);foreach (l; 0 .. L) {ff[l] = ff[l] * ff[l];}auto g = fft.inverseFft!real(ff);pragma(msg,typeof(g));foreach (i; 0 .. N) {g[cast(int)(2 * A[i])] -= 1.0;}auto cnt = new long[L];foreach (l; 0 .. L) {cnt[l] = cast(long)(round(g[l].re / 2.0));}debug {writeln("cnt = ", cnt[0 .. 20]);}const lm = cnt.maxIndex;cnt[lm] = 0;cnt[lm] = 1L * N * (N - 1) / 2 - cnt.sum;Mint ans = 1;foreach (l; 0 .. L) {if (cnt[l] > 0) {ans *= power(Mint(l), cnt[l]);}}long ASum;foreach_reverse (i; 0 .. N) {ans *= power(Mint(A[i]), ASum);ASum += A[i];}long AMin = long.max;auto opt = tuple(real.infinity, 0L, 0L);foreach_reverse (i; 0 .. N) {if (i < N - 1) {chmin(opt, tuple(log(A[i] + AMin) + log(A[i]) * AMin, A[i], AMin));}chmin(AMin, A[i]);}debug {writeln("opt = ", opt);}Mint dnm = (opt[1] + opt[2]) * power(Mint(opt[1]), opt[2]);ans *= modInv(dnm.x, MO);writeln(ans);}} catch (EOFException e) {}}