結果

問題 No.1358 [Zelkova 2nd Tune *] 語るなら枚数を...
ユーザー nikkukunnikkukun
提出日時 2021-01-22 23:28:11
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
WA  
実行時間 -
コード長 1,359 bytes
コンパイル時間 1,426 ms
コンパイル使用メモリ 166,168 KB
実行使用メモリ 8,760 KB
最終ジャッジ日時 2023-08-27 22:49:30
合計ジャッジ時間 5,640 ms
ジャッジサーバーID
(参考情報)
judge13 / judge14
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 36 ms
7,724 KB
testcase_01 AC 2 ms
4,380 KB
testcase_02 WA -
testcase_03 WA -
testcase_04 WA -
testcase_05 WA -
testcase_06 AC 92 ms
4,376 KB
testcase_07 WA -
testcase_08 WA -
testcase_09 WA -
testcase_10 WA -
testcase_11 TLE -
testcase_12 -- -
testcase_13 -- -
testcase_14 -- -
testcase_15 -- -
testcase_16 -- -
権限があれば一括ダウンロードができます

ソースコード

diff #

//
#include <bits/stdc++.h>
using namespace std;

#define fi first
#define se second
#define all(x) x.begin(), x.end()
#define lch (o << 1)
#define rch (o << 1 | 1)

typedef double db;
typedef long long ll;
typedef unsigned int ui;
typedef pair<int, int> pint;
typedef tuple<int, int, int> tint;

const int MOD = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const ll INF_LL = 0x3f3f3f3f3f3f3f3f;

// Cal(a, b, c, n) = sum[i = 1 -> n]: floor((a * i + b) / c)
ll euclidean(ll a, ll b, ll c, ll n) {
	if (a == 0) return b / c * (n + 1) % MOD;
	if (a >= c || b >= c)
		return (n * (n + 1) / 2 % MOD * (a / c) % MOD + (n + 1) * (b / c) % MOD + euclidean(a % c, b % c, c, n)) % MOD;
	ll m = (a * n + b) / c;
	return (n * m % MOD - euclidean(c, c - b - 1, a, m - 1)) % MOD;
}

ll cal(ll a, ll b, ll p) {
	ll xmax = p / a;
	ll x0 = p - a * xmax;
	ll ret = x0 / b + euclidean(a, x0 % MOD, b, xmax % MOD) + (xmax + 1);
	return ret % MOD;
}

void solve() {
	ll a, b, c, s;
	cin >> a >> b >> c >> s;

	if (s / a < s / c) swap(a, c);
	if (s / b < s / c) swap(b, c);

	ll sum = 0;
	ll zUpp = s / c;
	for (ll z = 0; z <= zUpp; z++) {
		ll p = s - z * c;
		if (p == 0)
			sum++;
		else if (p > 0)
			sum += cal(a, b, p) - cal(a, b, p - 1);
	}
	cout << (sum % MOD + MOD) % MOD << endl;
}

int main() {
	ios::sync_with_stdio(0);

	int t;
	cin >> t;
	while (t--) solve();

	return 0;
}
0