题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6608

大致题意是比p小的最大素数q,求q!%p的值。

由威尔逊定理开始推:

$(p-1)!\equiv-1(mod p)$

$(p-1)!modp\equiv p-1$

$q!*(q+1)*(q+2)*...*(p-1)modp\equiv p-1$

$q!modp=\tfrac{p-1}{(q+1)*(q+2)*...*(p-1)}modp$

然后只需要求出q就可以了,数量级1e9的判断素数可以用Miller_Rabin判断素数。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<string>
 5 #include<cmath>
 6 #include<vector>
 7 #include<ctime>
 8 using namespace std;
 9 typedef long long ll;
10 ll qmul(ll a, ll b, ll mod) {
11     ll ans = 0;
12     while (b) {
13         if (b & 1)
14             ans = (ans + a) % mod;
15         a = (a << 1) % mod;
16         b >>= 1;
17     }
18     return ans;
19 }
20 ll qpow(ll x, ll n, ll mod) {
21     ll ans = 1;
22     while (n) {
23         if (n & 1)
24             ans = qmul(ans, x, mod);
25         x = qmul(x, x, mod);
26         n >>= 1;
27     }
28     return ans;
29 }
30 bool Miller_Rabin(ll x) { //判断素数
31     srand(unsigned(time(NULL)));
32     ll s = 0, t = x - 1;
33     if (x == 2)  return true;   //2是素数
34     if (x < 2 || !(x & 1))  return false;     //如果x是偶数或者是0,1,那它不是素数
35     while (!(t & 1)) {  //将x分解成(2^s)*t的样子
36         s++;
37         t >>= 1;
38     }
39     for (int i = 0; i < 10; ++i) {      //随便选10个数进行测试
40         ll a = rand() % (x - 1) + 1;
41         ll b = qpow(a, t, x), k;      //先算出a^t
42         for (int j = 1; j <= s; ++j) {    //然后进行s次平方
43             k = qmul(b, b, x);   //求b的平方
44             if (k == 1 && b != 1 && b != x - 1)     //用二次探测判断
45                 return false;
46             b = k;
47         }
48         if (b != 1)  return false;   //用费马小定律判断
49     }
50     return true;   //如果进行多次测试都是对的,那么x就很有可能是素数
51 }
52 int main() {
53     int t;
54     scanf("%d", &t);
55     while (t--) {
56         ll p, q;
57         scanf("%lld", &p);
58         q = p - 1;
59         while (!Miller_Rabin(q))
60             --q;
61         ll ans = p - 1;
62         for (ll i = p - 1; i > q; --i)
63             ans = qmul(ans, qpow(i, p - 2, p), p);
64         printf("%lld\n", ans);
65     }
66     return 0;
67 }

转载于:https://www.cnblogs.com/sainsist/p/11342133.html

[2019杭电多校第三场][hdu6608]Fansblog相关推荐

  1. 2019杭电多校第三场 6608 Fansblog(威尔逊定理+miller_rabin素性测试)

    Problem Description 传送门 Farmer John keeps a website called 'FansBlog' .Everyday , there are many peo ...

  2. 2019 杭电 多校第3场 1006 Fansblog (HDU 6608)

    题目链接 题解: 用威尔逊定理变换,然后求逆元. 代码: #include <bits/stdc++.h> using namespace std; typedef long long l ...

  3. 2019.7.29 杭电多校第三场小结

    index > 杭电多校第三场 题号 标题 AC 做法 状态 6603 Azshara's deep sea (51/150)34.00% 6604 Blow up the city (213/ ...

  4. 2019杭电多校第9场1002 Rikka with Cake HDU6681

    2019杭电多校第9场1002 Rikka with Cake HDU6681 题意:给你若干个点按上下左右切割平面,最后问平面内有几块被切割开来. 解法1:红黑树+思维+贪心 A:根据欧拉定理可以得 ...

  5. 2019杭电多校 第七场 Kejin Player 6656(求期望值)

    2019杭电多校 第七场 Kejin Player 6656(求期望值) 题目 http://acm.hdu.edu.cn/showproblem.php?pid=6656 题意 给你n,q.表示有n ...

  6. 杭电2019多校第三场 HDU-6608 Fansblog

    题目:Fansblog 题意大致描述:给定一个质数P(1e9≤P≤1e14),找到比P小的最大的质数Q,并求出Q!%P 需要了解的知识 威尔逊定理 在初等数论中,威尔逊定理给出了判定一个自然数是否为素 ...

  7. 杭电2019多校第三场 HDU-6608 Fansblog(威尔逊定理+素数间隔+逆元)

    威尔逊定理:在初等数论中,威尔逊定理给出了判定一个自然数是否为素数的充分必要条件.即:当且仅当p为素数时:( p -1 )! ≡ -1 ( mod p ),但是由于阶乘是呈爆炸增长的,其结论对于实际操 ...

  8. 杭电2019多校第三场 HDU-6608 Fansblog(威尔逊定理+大数判素数+逆元)

    威尔逊定理:在初等数论中,威尔逊定理给出了判定一个自然数是否为素数的充分必要条件.即:当且仅当p为素数时:(p−1)!≡−1(modp)( p -1 )! ≡ -1 ( mod p )(p−1)!≡− ...

  9. 杭电多校第三场-H-Game

    题目描述 Again Alice and Bob is playing a game with stones. There are N piles of stones labelled from 1 ...

  10. 【2019.08.21】2019杭电多校第十场

    补题地址:http://acm.hdu.edu.cn/listproblem.php?vol=58 题号:6691-6701 1001: 1002: 1003:✅ 1004: 1005:✅ 1006: ...

最新文章

  1. Bootstrap select 多选并获取选中的值
  2. css如何设置dialog,css-dialog提示
  3. 011_Spring Data JPA多对多关系
  4. Python_sqlalchemy——创建、查询、删除、更新一对多的表
  5. java log4j 多个文件_为什么log4j会记录到两个单独的文件? [重复]
  6. Price determination entry point - how is 4.85 calculated
  7. 矩阵的对数运算公式_必修一——对数与对数运算
  8. 噪声的频谱分析的重要意义_噪声测量:噪声源识别与定位的方法简析
  9. Centos中iptables和firewall防火墙
  10. 内容页超连接关键词的完美实现
  11. 选项菜单-上下文菜单
  12. 渗透测试工具有哪些?
  13. Android手机健康类APP市场分析
  14. 六级听力技巧与备考策略
  15. 校园车辆管理系统的设计与实现(论文+源码)_kaic
  16. mysql mtq_mysql高级复习 - osc_r3mtqivi的个人空间 - OSCHINA - 中文开源技术交流社区
  17. python数字求和菜鸟教程_Python Number(数字) | 菜鸟教程
  18. python单曲循环播放MP3
  19. 服务器系统迁移工具,Win2008 R2迁移实战之迁移工具使用
  20. php仿u8系统模板_中文分词源码_7urpu8 采用php的源码实现 - 下载 - 搜珍网

热门文章

  1. video上传架构设计与实现
  2. 收集一些非常好用常用的用户函数。分享给大家参考。
  3. 使用Ant发布web应用到tomcat
  4. 王建林的一个亿,靠打工能实现么?
  5. 左手用R右手Python系列之——表格数据抓取之道
  6. 《机器学习实战》代码实现学习一 使用K-近邻算法改进约会网站的配对效果(数据准备)...
  7. Mathematics Base - 期望、方差、协方差、相关系数总结
  8. 【算法系列学习】Dijkstra单源最短路 [kuangbin带你飞]专题四 最短路练习 A - Til the Cows Come Home...
  9. unix解释器文件详解
  10. [原创]Datagrid和Button控件