結果
問題 | No.681 Fractal Gravity Glue |
ユーザー |
![]() |
提出日時 | 2017-11-06 20:36:34 |
言語 | Java (openjdk 23) |
結果 |
AC
|
実行時間 | 127 ms / 2,000 ms |
コード長 | 2,919 bytes |
コンパイル時間 | 2,143 ms |
コンパイル使用メモリ | 78,300 KB |
実行使用メモリ | 41,472 KB |
最終ジャッジ日時 | 2024-11-24 04:04:26 |
合計ジャッジ時間 | 5,477 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 20 |
ソースコード
import java.util.*;class Main {static final long MOD = 1000000007;static final long INFINITY = (1L << 62) - 1;static void myAssert(boolean condition) {if (!condition) {throw new RuntimeException("assert ga mitasarete nai");}}static long limitedPower(long x, long exponent) {if (x < 0 || exponent < 0) {throw new RuntimeException();}if (x == 1) {return 1;}if (x == 0) {return exponent == 0 ? 1 : 0;}if (exponent == 0) {return 1;}if (x >= INFINITY || exponent >= 100) {return INFINITY;}long limit = INFINITY / x;long prod = 1;for (int i = 0; i < exponent; ++i) {if (prod > limit) {return INFINITY;}prod *= x;}return prod;}static long powerMod(long x, long exponent) {long prod = 1;for (int i = 63; i >= 0; --i) {prod = (prod * prod) % MOD;if ((exponent & 1L << i) != 0) {prod = (prod * x) % MOD;}}return prod;}static long height(int b, int d) {return (powerMod(d + 1, b) + MOD - 1) % MOD;}static long limitedHeight(int b, int d) {return limitedPower(d + 1, b) - 1;}static long wholeSize(int b, int d) {long temp = powerMod(d + 1, b) + MOD - 1;temp %= MOD;temp = (temp * (d + 1)) % MOD;temp = (temp * powerMod(d, MOD - 2)) % MOD;temp = (temp + MOD - b) % MOD;return temp;}static long nthSizeSub(int b, int d, long n) {myAssert(n <= limitedHeight(b, d));if (n == 0) {return 0;}long prevHeight = limitedHeight(b - 1, d);long temp = n / (prevHeight + 1);long total = (wholeSize(b - 1, d) + b) * temp % MOD;long remainder = n % (prevHeight + 1);return total + nthSizeSub(b - 1, d, remainder);}static long nthSize(int b, int d, int n) {// n <= limitedHeight(k, d) to naru youna saisyouno k wo mitukeruint k = 0;while (true) {if (n <= limitedHeight(k, d)) {break;}k++;}assert (k <= b);return nthSizeSub(k, d, n);}public static void main(String[] args) {Scanner scan = new Scanner(System.in);int n = Integer.parseInt(scan.next());int b = Integer.parseInt(scan.next());int d = Integer.parseInt(scan.next());myAssert(0 <= n);myAssert(n <= 1000000000);myAssert(1 <= b);myAssert(b <= 1000000000);myAssert(1 <= d);myAssert(d <= 1000000000);myAssert(n <= limitedHeight(b, d));System.out.println((wholeSize(b, d) - nthSize(b, d, n) + MOD) % MOD);}}