题目链接:

hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5666

bc(中文):http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=688&pid=1002

题解:

首先可以统计出三角形内所有的点数,(q-2)+(q-3)+...+1=(q-1)*(q-2)/2

其次只要减去被线段割到的点,对于线段xi+yi=q,割到的点有gcd(xi,yi)-1=gcd(xi,q-xi)-1=gcd(xi,q)-1;由于q为质数,所以没有没被割到的点。

综上所述,答案为(q-1)*(q-2)/2;

由于(q-1)*(q-2)超过long long 的范围,所以不能直接求解。

以下提供两种解题方案。

1、用java求大数:

 1 import java.util.*;
 2 import java.math.*;
 3 public class Main {
 4     public static void main(String args[]){
 5         Scanner cin = new Scanner(System.in);
 6         long q,P;
 7         int tc=cin.nextInt();
 8
 9         while((tc--)>0){
10             q=cin.nextLong();
11             P=cin.nextLong();
12             BigInteger q1=new BigInteger(Long.toString(q-1));
13             BigInteger q2=new BigInteger(Long.toString(q-2));
14             BigInteger ans=q1.multiply(q2);
15             ans=ans.divide(BigInteger.valueOf(2));
16             ans=ans.remainder(new BigInteger(Long.toString(P)));
17             System.out.println(ans.toString());
18         }
19     }
20 }

2、模拟笔算二进制乘法

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<vector>
 5 using namespace std;
 6
 7 const int maxn=1e5+10;
 8 typedef long long LL;
 9
10 const LL ONE=1;
11 LL mul(LL a,LL b,LL p){
12     LL ret=0;
13     for(;b>0;b>>=1){
14         if(b&1){
15             ret+=a;
16             ret%=p;
17         }
18         a=(a+a)%p;
19     }
20     return ret;
21 }
22
23 int main() {
24     int tc;
25     scanf("%d",&tc);
26     while(tc--) {
27         LL q,p;
28         scanf("%lld%lld",&q,&p);
29         LL q1=q-1,q2=q-2;
30         if(q1&1) q2/=2;
31         else q1/=2;
32         LL ans=mul(q1,q2,p);
33         printf("%lld\n",ans);
34     }
35     return 0;
36 }

转载于:https://www.cnblogs.com/fenice/p/5402696.html

HDU 5666 Segment 数论+大数相关推荐

  1. hdu 5568(dp+大数模拟)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5568 官方题解: #include <cstdio> #include <cstri ...

  2. hdu 1042 N!(大数)

    题意:求n!(0 ≤ N ≤ 10000) 思路:大数,用数组存储 1.首先要考虑数据N!的位数,因为最大是10000!,可以计算一下大概是5+9000*4+900*3+90*2+10*1=38865 ...

  3. hdu 1134 卡特兰数(大数模板)

    卡特兰数 递推公式: C(n)=C(2n,n)/(n+1)  即用数组表示为c[i]=c[i-1]*(4*i-2)/(i+1); 一般形式 直接 表达 c[1]=1; for(i=2;i<40; ...

  4. hdu 4279Number(数论)

    传送门 参考资料: [1]:https://www.2cto.com/kf/201308/233613.html 题意,题解在上述参考资料中已经介绍的非常详细了,接下来的内容只是记录一下我的理解: 我 ...

  5. HDU 1002 A+BII大数

    此题杀死各种新手,当年被此题卡住两个星期辗转难眠,最终发现拿数组存下每位数然后模仿笔算即可,附渣代码: #include <stdio.h> #include <string.h&g ...

  6. HDU 1495 非常可乐(数论,BFS)

    非常可乐 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  7. hdu 多校数论 GuGuFishtion

    容斥+gcd+欧拉函数 求出1-n 和 1-m所有gcd(i,j)==x对数 x的范围1-min(n,m) 分解x的质因子 (1-1/p)... q[x]=(1-1/p1)*(1-1/p2)/... ...

  8. hdu 4196(数论)

    题意:问小于n的数的乘积能拼成的最大平方数是多少? 思路:给n!做质数分解在除去指数为奇数的那些质数,由于题目中需要模运算所以不能直接除,必须乘上摸逆. 代码如下: 1 /************** ...

  9. HDU 1695(数论,筛选+素因子分解+容斥)

    题意:已知给定k,x,y求 1<=a<=x 1<=b<=y 中满足 gcd(a,b)=k 的(a,b)对数.(注意数对是无序的). 1<=x,y<=1e5, 0&l ...

最新文章

  1. 为什么要在JavaScript中使用静态类型? (使用Flow进行静态打字的4部分入门)
  2. 每日一皮:最真实的现代互联网商业模式
  3. 关于angular2更新时机的一些发现
  4. c#(6)——数组的应用和二维数组
  5. 用vue实现简单实时汇率计算功能
  6. Oracle date日期类型使用
  7. 如何克服presentation恐惧呢?
  8. (四)BP神经网络预测(上)
  9. 多目标跟踪 综述(三)
  10. php 爬虫框架QueryList
  11. python编解码的字节与字符串相互转换
  12. TMS320F28335的特点
  13. WordPress使用邮箱服务功能
  14. 新浪微博技术架构分析
  15. bzoj2555 SubString (SAM+LCT维护子树大小/ETT)
  16. [深度学习之CNN]CNN卷积神经网络LeNet-5
  17. 直观理解Dilated Convolution
  18. 通过 TokenType(){}.getType()获取Persionlt;Tgt; 泛型T的类型和数值
  19. OpenGL画三角形
  20. 信号链(Signal Chain)芯片

热门文章

  1. 【java】窗口和流的应用
  2. springboot文件上传和下载工具_SpringBoot图文教程7—SpringBoot拦截器的使用姿势这都有...
  3. PyTorch 模型训练实用教程(附代码)
  4. 随机森林的原理及Python代码实现
  5. php执行查询的代码,PHP实现动态执行代码的方法
  6. leetcode两数之和,三数之和,四数之和问题
  7. 创新方法(TRIZ)理论及应用(一)
  8. Ruby设计模式透析之 —— 适配器(Adapter)
  9. Android服务查询完整过程源码分析
  10. Eclipse用法和技巧十八:减少不必要的输入