結果

問題 No.3361 2解間格子点
コンテスト
ユーザー kakel-san
提出日時 2025-11-17 23:42:07
言語 C#
(.NET 8.0.404)
結果
AC  
実行時間 63 ms / 2,000 ms
コード長 2,584 bytes
コンパイル時間 9,990 ms
コンパイル使用メモリ 171,848 KB
実行使用メモリ 189,788 KB
最終ジャッジ日時 2025-11-17 23:42:29
合計ジャッジ時間 21,225 ms
ジャッジサーバーID
(参考情報)
judge1 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 65
権限があれば一括ダウンロードができます
コンパイルメッセージ
  復元対象のプロジェクトを決定しています...
  /home/judge/data/code/main.csproj を復元しました (132 ミリ秒)。
  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 static System.Console;
using System.Linq;
using System.Collections.Generic;
using System.Globalization;
using System.Runtime.CompilerServices;

class Program
{
    static int NN => int.Parse(ReadLine());
    static long[] NList => ReadLine().Split().Select(long.Parse).ToArray();
    static string[] SList(long n) => Enumerable.Repeat(0, (int)n).Select(_ => ReadLine()).ToArray();
    public static void Main()
    {
        Solve();
    }
    static void Solve()
    {
        var p = NList;
        var (a, b, c) = (p[0], p[1], p[2]);
        WriteLine(Point(a, b, c));
    }
    static long Point(long a, long b, long c)
    {
        var r = Sqrt(b * b - 4 * a * c);
        if (r * r < b * b - 4 * a * c) ++r;
        if (a > 0)
        {
            // -r < 2ax + b < r
            var ng = -1L;
            while (-r <= 2 * a * ng + b) ng <<= 1;
            var ok = 1L;
            while (-r >= 2 * a * ok + b) ok <<= 1;
            while (ok - ng > 1)
            {
                var mid = (ok + ng) / 2;
                if (-r < 2 * a * mid + b) ok = mid;
                else ng = mid;
            }
            var left = ok;
            ng = 1L;
            while (r >= 2 * a * ng + b) ng <<= 1;
            ok = -1L;
            while (r <= 2 * a * ok + b) ok <<= 1;
            while (ng - ok > 1)
            {
                var mid = (ok + ng) / 2;
                if (r > 2 * a * mid + b) ok = mid;
                else ng = mid;
            }
            return Math.Max(0, ok - left + 1);
        }
        else
        {
            // -r < 2ax + b < r
            var ng = 1L;
            while (-r <= 2 * a * ng + b) ng <<= 1;
            var ok = -1L;
            while (-r >= 2 * a * ok + b) ok <<= 1;
            while (ng - ok > 1)
            {
                var mid = (ok + ng) / 2;
                if (-r < 2 * a * mid + b) ok = mid;
                else ng = mid;
            }
            var right = ok;
            ng = -1L;
            while (r >= 2 * a * ng + b) ng <<= 1;
            ok = 1L;
            while (r <= 2 * a * ok + b) ok <<= 1;
            while (ok - ng > 1)
            {
                var mid = (ok + ng) / 2;
                if (r > 2 * a * mid + b) ok = mid;
                else ng = mid;
            }
            return Math.Max(0, right - ok + 1);
        }
    }
    static long Sqrt(long a)
    {
        var r = (long)Math.Sqrt(a);
        if ((r + 1) * (r + 1) <= a) return r + 1;
        return r;
    }
}
0