您的位置:首页 > 其它

BestCoder Round #80(B)高精度

2016-04-17 10:29 260 查看


Segment

 
 Accepts: 418
 
 Submissions: 2020

 Time Limit: 2000/1000 MS (Java/Others)
 
 Memory Limit: 65536/65536 K (Java/Others)

问题描述
\ \ \ \    Rivendell非常神,喜欢研究奇怪的问题.

\ \ \ \    今天他发现了一个有趣的问题.找到一条线段x+y=qx+y=q,令它和坐标轴在第一象限围成了一个三角形,然后画线连接了坐标原点和线段上坐标为整数的格点.

\ \ \ \    请你找一找有多少点在三角形的内部且不是线段上的点,并将这个个数对PP取模后告诉他.

输入描述
\ \ \ \    第一行一个数T,为测试数据组数.

\ \ \ \    接下来每一行两个数qq,PP,意义如题目中所示.

\ \ \ \ q    q是质数且q\le 10^{18},1\le P\le 10^{18},1\le T \le 10q≤10​18​​,1≤P≤10​18​​,1≤T≤10.

输出描述
\ \ \ \    对每组数据,输出点的个数模PP后的值.

输入样例
1
2 107

输出样例
0


题解:画个图数一下



可以找到规律,是个等差数列求和,这里直接使用公式求和会爆LL,而使用循环求和会超时,这题有2种解法。1。Java大法好,直接上高精度大整数就好啦,2.使用快速和取模

import java.lang.reflect.Array;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.Scanner;

public class Main
{
public static void main(String[] args)
{
int n;
Scanner in=new Scanner(System.in);
n=in.nextInt();
BigInteger p,q;
while(n--!=0)
{
BigInteger sum= new BigInteger("2");
p=in.nextBigInteger();
q=in.nextBigInteger();
if(p.compareTo(BigInteger.ONE)==0||p.compareTo(sum)==0)
{
System.out.println("0");
}
else
{
BigInteger ww=new BigInteger("2");;
p=p.subtract(ww);
sum=p.add(BigInteger.ONE);
p=p.multiply(sum);
p=p.divide(ww);
System.out.println(p.mod(q));
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: