結果

問題 No.1680 Sum and Difference
ユーザー merlinmerlin
提出日時 2021-09-17 23:19:58
言語 Java21
(openjdk 21)
結果
WA  
実行時間 -
コード長 2,145 bytes
コンパイル時間 2,056 ms
コンパイル使用メモリ 77,452 KB
実行使用メモリ 52,360 KB
最終ジャッジ日時 2024-06-29 22:09:33
合計ジャッジ時間 3,970 ms
ジャッジサーバーID
(参考情報)
judge3 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 53 ms
50,276 KB
testcase_01 AC 53 ms
50,240 KB
testcase_02 AC 53 ms
50,192 KB
testcase_03 AC 55 ms
49,916 KB
testcase_04 WA -
testcase_05 AC 54 ms
50,272 KB
testcase_06 AC 52 ms
50,336 KB
testcase_07 WA -
testcase_08 WA -
testcase_09 WA -
testcase_10 WA -
testcase_11 WA -
testcase_12 WA -
testcase_13 WA -
testcase_14 WA -
testcase_15 WA -
testcase_16 WA -
testcase_17 WA -
testcase_18 WA -
testcase_19 WA -
testcase_20 WA -
権限があれば一括ダウンロードができます

ソースコード

diff #

import java.io.*;
import java.util.*;

class Main
{
    public static void main(String args[])throws Exception
    {
        BufferedReader bu=new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb=new StringBuilder();
        String s[]=bu.readLine().split(" ");
        long a=Long.parseLong(s[0]),b=Long.parseLong(s[1]);
        long times=maximum(a,b,0),M=(int)1e9+7;
        times-=minimum(a,b,0,times)-1;

        long l=0,r=(long)1e18,mid,ans=1;
        while(l<=r)
        {
            mid=(l+r)>>1;
            long v=maximum(a,b,mid);
            if(v==-1) v=0;
            else v-=minimum(a,b,mid,v)-1;

            if(v==times)
            {
                ans=mid+1;
                l=mid+1;
            }
            else r=mid-1;
        }

        //System.out.println(times+" "+ans);
        long fin=times%M*((ans*2-1)%M)%M;
        long ma=maximum(a,b,ans);
        if(ma==-1) times=0;
        else times=ma-minimum(a,b,ans,ma)+1;
        long A,N;
        //System.out.println(times);
        if(times%2==0)
        {
            A=2;
            N=times/2;
        }
        else
        {
            A=1;
            N=(times+1)/2;
        }
        //System.out.println(A+" "+N);
        long add=A*N%M;
        add+=N*N%M;
        add=add-N+M;
        add=add*2%M;
        //System.out.println(add);
        fin=(fin+add)%M;
        System.out.println(fin);
    }

    static long minimum(long a,long b,long m,long r)
    {
        if(m>a) return 0;
        long l=m-b,mid,ans=r;
        while(l<=r)
        {
            mid=(l+r)>>1;
            if(Math.abs(m-mid)<=b && Math.abs(m+mid)<=a)
            {
                ans=mid;
                r=mid-1;
            }
            else l=mid+1;
        }
        return ans;
    }

    static long maximum(long a,long b,long m)
    {
        if(a<m) return -1;
        long l=Math.max(0,m-b),r=m+b,mid,ans=-1;
        while(l<=r)
        {
            mid=(l+r)>>1;
            if(Math.abs(m+mid)<=a)
            {
                ans=mid;
                l=mid+1;
            }
            else r=mid-1;
        }
        return ans;
    }
}
0