結果

問題 No.2 素因数ゲーム
ユーザー nokonoko
提出日時 2025-09-23 08:53:41
言語 C#
(.NET 8.0.404)
結果
AC  
実行時間 89 ms / 5,000 ms
コード長 2,798 bytes
コンパイル時間 8,343 ms
コンパイル使用メモリ 168,216 KB
実行使用メモリ 187,252 KB
最終ジャッジ日時 2025-09-23 08:53:55
合計ジャッジ時間 12,248 ms
ジャッジサーバーID
(参考情報)
judge1 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 31
権限があれば一括ダウンロードができます
コンパイルメッセージ
  復元対象のプロジェクトを決定しています...
  /home/judge/data/code/main.csproj を復元しました (102 ミリ秒)。
  main -> /home/judge/data/code/bin/Release/net8.0/main.dll
  main -> /home/judge/data/code/bin/Release/net8.0/publish/

ソースコード

diff #

using System;
using System.Linq;
using System.Text;
using System.Collections.Generic;
using STR = System.String;
using INT = System.Int64;
using DEC = System.Double;

class Program
{
    public static IO IO = new IO();
    static void Main(string[] args)
    {
        INT n = IO.I();
        Dictionary<INT, INT> factorization = PRIME.FACTORIZATION(n);
        INT xor = 0;
        foreach (INT buf in factorization.Values) { xor ^= buf; }
        IO.W(xor == 0 ? "Bob" : "Alice");
        IO.F();
    }
}
// 素数処理
public class PRIME
{
    public static bool ISPRIME(INT p)
    {
        bool f = false;
        if (p == 2) { f = true; }
        else if (p > 2 && (p % 2 != 0))
        {
            f = true;
            INT q = (INT)Math.Sqrt(p);
            for (INT j = 3; j <= q; j += 2) { if (p % j == 0) { f = false; break; } }
        }
        return f;
    }
    public static Dictionary<INT, INT> FACTORIZATION(INT n)
    {
        Dictionary<INT, INT> ret = new Dictionary<INT, INT>();
        int p = 0;
        while (n % 2 == 0 && n > 1) { n /= 2; p++; }
        ret[2] = p;
        int j = 3;
        while (n > 1 && j * j <= n)
        {
            p = 0;
            while (n % j == 0) { n /= j; p++; }
            ret[j] = p;
            j += 2;
        }
        if (n > 1) { ret[n] = 1; }
        return ret;
    }
}
public class IO
{
    private const int WMAX = 1000;
    private StringBuilder SB = new StringBuilder();
    private T R<T>(Func<STR, T> f) { return f(Console.ReadLine()); }
    private T[] R<T>(Func<STR, T> f, char c) { return S().Split(c).Select(f).ToArray(); }
    private T[] R<T>(Func<STR, T> f, INT l) { T[] r = new T[l]; for (INT i = 0; i < l; i++) { r[i] = R(f); } return r; }
    private T[][] R<T>(Func<STR, T> f, INT l, char c) { T[][] r = new T[l][]; for (INT i = 0; i < l; i++) { r[i] = R<T>(f, c); } return r; }
    private void W<T>(Func<T, STR> f, T v, bool lf = true) { SB.Append(f(v)); if (lf) { SB.Append('\n'); } if (SB.Length >= WMAX) { F(); } }
    public STR S() { return R(s => s); }
    public STR[] S(char c) { return R(s => s, c); }
    public STR[] S(INT l) { return R(s => s, l); }
    public STR[][] S(INT l, char c) { return R(s => s, l, c); }
    public INT I() { return R(INT.Parse); }
    public INT[] I(char c) { return R(INT.Parse, c); }
    public INT[] I(INT l) { return R(INT.Parse, l); }
    public INT[][] I(INT l, char c) { return R(INT.Parse, l, c); }
    public DEC D() { return R(DEC.Parse); }
    public DEC[] D(char c) { return R(DEC.Parse, c); }
    public DEC[] D(INT l) { return R(DEC.Parse, l); }
    public DEC[][] D(INT l, char c) { return R(DEC.Parse, l, c); }
    public void W(object s, bool lf = true) { W(v => v.ToString(), s, lf); }
    public void F() { Console.Write(SB); SB.Length = 0; }
}
0