hdu5666 BestCoder Round #80
Segment
Accepts: 418
Submissions: 2020
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
问题描述
Rivendell非常神,喜欢研究奇怪的问题. 今天他发现了一个有趣的问题.找到一条线段x+y=q,令它和坐标轴在第一象限围成了一个三角形,然后画线连接了坐标原点和线段上坐标为整数的格点. 请你找一找有多少点在三角形的内部且不是线段上的点,并将这个个数对P取模后告诉他.
输入描述
第一行一个数T,为测试数据组数. 接下来每一行两个数q,P,意义如题目中所示. q是质数且q≤1018,1≤P≤1018,1≤T≤10.
输出描述
对每组数据,输出点的个数模P后的值.
输入样例
1 2 107
输出样例
0
官方解:
考虑一条以(0,0)为起点,(x,y)为终点的线段上格点的个数(不包含端点时),一定是gcd(x,y)−1,这个很显然吧.
然后整个网格图范围内的格点数目是2q∗(q−1).
所以答案就是2q∗(q−1)− 所有线段上的格点的个数.
因为gcd(a,b)=gcd(a,b−a) (b>a),所以gcd(x,y)=gcd(x,p−x)=gcd(x,p),p是质数,所以gcd(x,y)=1,所以线段上都没有格点,所以答案就是2q∗(q−1).
因为数据比较大,所以用的java.当然也可以考虑按位乘1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | import java.io.BufferedInputStream; import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO 自动生成的方法存根 Scanner cin = new Scanner ( new BufferedInputStream(System.in)); int T; BigInteger c; BigInteger d; T = cin.nextInt(); while (T > 0 ){ c = cin.nextBigInteger(); d = cin.nextBigInteger(); BigInteger a = c.subtract(BigInteger.valueOf( 2 )); if (a.equals(BigInteger.valueOf( 0 ))) { System.out.println( 0 ); } else { c = a.add(BigInteger.valueOf( 1 )); //system.out.println(c); a = c.multiply(a); //System.out.println(a); a = a.divide(BigInteger.valueOf( 2 )); a = a.remainder(d); System.out.println(a); } T--; } } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步