题目链接:BZOJ - 2186

题目分析

题目要求出 [1, n!] 中有多少数与 m! 互质。(m <= n)

那么在 [1, m!] 中有 phi(m!) 个数与 m! 互质,如果一个数 x 与 m! 互质,即 gcd(m!, x) = 1,

那么 gcd(m!, m! + x) = 1, gcd(m!, m! * 2 + x) = 1, 即 x + k * m! 都与 m! 互质。

这样就很明确了,[1, n!] 中与 m! 互质的数有 phi(m!) * n! / m! 个。

怎么求 phi(m!) 呢?我们知道,一个数 x 如果包含 p^a ,那么 phi(x) 中就含有 p^(a-1) * (p - 1)。

也就是说, phi(x) = x / pi * (pi - 1) , pi 是枚举 x 包含的质数。那么 m! 包含的质数就是 [1, m] 的质数,线性筛就可以了。

最后化简 Ans = n! / pi * (pi - 1) 。pi 是 [1, m] 的质数。

代码

  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <cstdio>
  5. #include <cmath>
  6. #include <algorithm>
  7.  
  8. using namespace std;
  9.  
  10. typedef long long LL;
  11.  
  12. const int MaxN = 10000000 + 5, MN = 10000000;
  13.  
  14. int T, Mod, n, m, Top, Ans;
  15. int Prime[MaxN], Fac[MaxN], Inv[MaxN], Pi[MaxN];
  16.  
  17. bool isPrime[MaxN];
  18.  
  19. void Prepare()
  20. {
  21. for (int i = 1; i <= MN; ++i) isPrime[i] = true;
  22. isPrime[1] = false;
  23. for (int i = 2; i <= MN; ++i)
  24. {
  25. if (isPrime[i]) Prime[++Top] = i;
  26. for (int j = 1; j <= Top && i * Prime[j] <= MN; ++j)
  27. {
  28. isPrime[i * Prime[j]] = false;
  29. if (i % Prime[j] == 0) break;
  30. }
  31. }
  32. Inv[1] = 1;
  33. int q, r;
  34. for (int i = 2; i <= MN; ++i)
  35. {
  36. q = Mod / i;
  37. r = Mod % i;
  38. Inv[i] = (int)((LL)(Mod - q) * (LL)Inv[r] % Mod);
  39. }
  40. Fac[0] = Pi[0] = 1;
  41. for (int i = 1; i <= MN; ++i)
  42. {
  43. Fac[i] = (int)((LL)Fac[i - 1] * (LL)i % Mod);
  44. if (isPrime[i]) Pi[i] = (int)((LL)Pi[i - 1] * (LL)Inv[i] % Mod * (LL)(i - 1) % Mod);
  45. else Pi[i] = Pi[i - 1];
  46. }
  47. }
  48.  
  49. int main()
  50. {
  51. scanf("%d%d", &T, &Mod);
  52. Prepare();
  53. for (int Case = 1; Case <= T; ++Case)
  54. {
  55. scanf("%d%d", &n, &m);
  56. Ans = (int)((LL)Fac[n] * (LL)Pi[m] % Mod);
  57. printf("%d\n", Ans);
  58. }
  59. return 0;
  60. }

  

[BZOJ 2186] [Sdoi2008] 沙拉公主的困惑 【欧拉函数】的更多相关文章

  1. 【bzoj2186】[Sdoi2008]沙拉公主的困惑 欧拉函数

    题目描述 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一大户沙拉公主决定预测一下大富翁国现在所有真钞票的 ...

  2. [BZOJ 2186][Sdoi2008]沙拉公主的困惑(欧拉函数)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2186 分析: 就是要求1~n!中与m!互质的数的个数 首先m!以内的就是φ(m!) 关 ...

  3. bzoj 2186 [Sdoi2008]沙拉公主的困惑 欧拉函数

    n>=m,所以就变成了求 ϕ(m!)∗n!/m! 而 ϕ(m!)=m!∗(p−1)/p...... p为m!的素因子,即为m内的所有素数,问题就转化为了求 n!∗(p−1)/p...... 只需 ...

  4. Bzoj 2186: [Sdoi2008]沙拉公主的困惑 乘法逆元,线性筛,欧拉函数,数论

    2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 2560  Solved: 857[Submit][St ...

  5. 数学(逆元):BZOJ 2186: [Sdoi2008]沙拉公主的困惑

    2186: [Sdoi2008]沙拉公主的困惑 Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞 ...

  6. bzoj 2186 [Sdoi2008]沙拉公主的困惑(欧拉函数,逆元)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2186 [题意] 若干个询问,求1..n!中与m!互质的个数. [思路] 首先有gcd( ...

  7. BZOJ 2186 [Sdoi2008]沙拉公主的困惑 【逆元】

    题意:求中互质的数的个数,其中. 分析:因为,所以,我们很容易知道如下结论    对于两个正整数和,如果是的倍数,那么中与互素的数的个数为      本结论是很好证明的,因为中与互素的个数为,又知道, ...

  8. bzoj 2186: [Sdoi2008]沙拉公主的困惑

    #include<cstdio> #include<iostream> #define ll long long #define N 10000009 using namesp ...

  9. BZOJ 2186 SDOI2008 沙拉公主的困惑 数论

    题目大意:给定询问组数T和取模数P,每次询问给定两个整数n和m,求1~(n!)的数中与m!互质的数个个数模P (m<=n) 首先T<=1W,暴力肯定过不去,我们须要预处理一些东西 首先我们 ...

随机推荐

  1. 指向函数的指针 分类: C/C++ 2015-07-13 11:03 14人阅读 评论(0) 收藏

    原文网址:http://www.cnblogs.com/zxl2431/archive/2011/03/25/1995285.html 讲的很清楚,备份记录. (一) 用函数指针变量调用函数 可以用指 ...

  2. MySQL源码:索引相关的数据结构

    http://www.orczhou.com/index.php/2012/11/mysql-source-code-data-structure-about-index/ 本文将尝试介绍MySQL索 ...

  3. hdu2045java递推

    不容易系列之(3)—— LELE的RPG难题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/O ...

  4. popupWindow使用详解

    popupWindow说起来简单,但是使用略麻烦,今天带大家来看看怎么使用,先来看看效果图: 先来看看布局文件吧: <RelativeLayout xmlns:android="htt ...

  5. 能发送http请求(get,post)的工具

    能发送http请求(get,post)的工具, 1.  fiddler 前端自己模拟发送请求 2.  其他 链接:https://www.zhihu.com/question/20367546/ans ...

  6. 使用微信js接口的方法 ,以调用相机为例

    protected string GetTimeStamp_Str=""; protected string nonceStr_Str = ""; protec ...

  7. js跨浏览器事件对象、事件处理程序

    项目中有时候会不用jquery这么好用的框架,需要自己封装一些事件对象和事件处理程序,像封装AJAX那样:这里面考虑最多的还是浏览器的兼容问题,原生js封装如下:var EventUtil={ //节 ...

  8. Redhat linux DNS配置指南(SCANIP配置手册)

    在oracle 11g的RAC中增加了SCAN IP,而使用 SCAN IP的一种方式就是使用DNS,这里介绍在Redhat Linux 5.4中DNS的详细配置操作在配置DNS之前修改主机名Redh ...

  9. 小白偶遇Sublime Text 3

    sublime text3号称神一样的编辑器,主要归功于它丰富的插件所带来的可扩展性.以前曾经抱着玩一玩的心态下载了sublime ,没有插件的sublime 很快被我扔到一边.在用过很多的编辑器后, ...

  10. 一行代码实现headView弹簧拉伸效果

    前言 很多app的个人中心上部的headView都实现了弹簧拉伸的效果,即tableView的top并不随着下拉而滑动,而是紧紧的停在屏幕的最上方. 我们今天就分析一下这个效果的实现方式. 分析 关键 ...