結果

問題 No.456 Millions of Submits!
ユーザー はむ吉🐹はむ吉🐹
提出日時 2017-01-02 21:51:38
言語 D
(dmd 2.106.1)
結果
WA  
(最新)
AC  
(最初)
実行時間 -
コード長 879 bytes
コンパイル時間 2,639 ms
コンパイル使用メモリ 151,172 KB
実行使用メモリ 6,944 KB
最終ジャッジ日時 2024-06-12 06:15:02
合計ジャッジ時間 7,217 ms
ジャッジサーバーID
(参考情報)
judge5 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 WA -
testcase_01 WA -
testcase_02 WA -
testcase_03 WA -
testcase_04 WA -
testcase_05 WA -
testcase_06 WA -
testcase_07 WA -
testcase_08 WA -
testcase_09 WA -
testcase_10 WA -
testcase_11 WA -
testcase_12 WA -
権限があれば一括ダウンロードができます
コンパイルメッセージ
Main.d(27): Deprecation: template `std.math.operations.approxEqual(T, U, V)(T value, U reference, V maxRelDiff = 0.01, V maxAbsDiff = 1e-05)` is deprecated - approxEqual will be removed in 2.106.0. Please use isClose instead.
Main.d(41):        instantiated from here: `solveEquation!real`
Main.d(29): Deprecation: template `std.math.operations.approxEqual(T, U, V)(T value, U reference, V maxRelDiff = 0.01, V maxAbsDiff = 1e-05)` is deprecated - approxEqual will be removed in 2.106.0. Please use isClose instead.
Main.d(41):        instantiated from here: `solveEquation!real`
Main.d(17): Deprecation: template `std.math.operations.approxEqual(T, U, V)(T value, U reference, V maxRelDiff = 0.01, V maxAbsDiff = 1e-05)` is deprecated - approxEqual will be removed in 2.106.0. Please use isClose instead.
Main.d(32):        instantiated from here: `lambertW!real`
Main.d(41):        instantiated from here: `solveEquation!real`

ソースコード

diff #

import std.algorithm.iteration;
import std.conv;
import std.math;
import std.stdio;
import std.string;


const real EPS = 1e-9;


// https://ja.wikipedia.org/wiki/ランベルトのW関数
T lambertW(T)(T z, T tol=EPS, int iter=1000){
	T xi = 1.0f;
	T xj;
	foreach (i; 0 .. iter){
		xj = xi - (xi * exp(xi) - z) / (exp(xi) + xi * exp(xi));
		if (approxEqual(xi, xj, EPS)){
			return xj;
		}
		xi = xj;
	}
	throw new Exception("Failure: No convergence");
}


T solveEquation(T)(T a, T b, T t, T tol=EPS){
	if (approxEqual(a, 0, EPS)){
		return exp(pow(t, 1 / b));
	} else if (approxEqual(b, 0, EPS)) {
		return pow(t, 1 / a);
	} else {
		return exp(b / a * lambertW(a / b * pow(t, 1 / b)));
	}
}


void main(){
	auto m = readln.chomp.to!int;
	foreach (i; 0..m) {
		auto s = readln.split.map!(to!real);
		auto res = solveEquation(s[0], s[1], s[2]);
		writefln("%.11f\n", res);
	}
}
0