結果

問題 No.3476 {2^n-1}-gon
コンテスト
ユーザー ks2m
提出日時 2026-03-20 22:36:06
言語 Java
(openjdk 25.0.2)
コンパイル:
javac -encoding UTF8 _filename_
実行:
java -ea -Xmx700m -Xss256M -DONLINE_JUDGE=true _class_
結果
AC  
実行時間 259 ms / 2,000 ms
コード長 1,282 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 2,016 ms
コンパイル使用メモリ 82,560 KB
実行使用メモリ 47,488 KB
最終ジャッジ日時 2026-03-20 22:36:14
合計ジャッジ時間 5,801 ms
ジャッジサーバーID
(参考情報)
judge3_1 / judge2_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 18
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

import java.util.Scanner;

public class Main {
	public static void main(String[] args) throws Exception {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		sc.close();

		int mod = 998244353;
		long v1 = 1;
		long n1 = power(2, n, mod) - 1;
		for (int i = 1; i <= m; i++) {
			long ni = n1 - i + 1;
			if (ni < 0) ni += mod;
			v1 *= ni;
			v1 %= mod;
			long mi = modinv(i, mod);
			v1 *= mi;
			v1 %= mod;
		}

		long v2 = 1;
		long n2 = power(2, n - 1, mod) - 1;
		for (int i = 1; i < m; i++) {
			long ni = n2 - i + 1;
			if (ni < 0) ni += mod;
			v2 *= ni;
			v2 %= mod;
			long mi = modinv(i, mod);
			v2 *= mi;
			v2 %= mod;
		}
		v2 *= n1;
		v2 %= mod;

		long ans = (v1 - v2) % mod;
		if (ans < 0) ans += mod;
		System.out.println(ans);
	}

	static long power(long x, long n, int m) {
		if (n == 0) {
			return 1;
		}
		long val = power(x, n / 2, m);
		val = val * val % m;
		if (n % 2 == 1) {
			x %= m;
			val = val * x % m;
		}
		return val;
	}

	static long modinv(long a, int m) {
		long b = m;
		long u = 1;
		long v = 0;
		long tmp = 0;

		while (b > 0) {
			long t = a / b;
			a -= t * b;
			tmp = a;
			a = b;
			b = tmp;

			u -= t * v;
			tmp = u;
			u = v;
			v = tmp;
		}

		u %= m;
		if (u < 0) u += m;
		return u;
	}
}
0