题目大意:给定询问组数T和取模数P,每次询问给定两个整数n和m,求1~(n!)的数中与m!互质的数个个数模P (m<=n)

首先T<=1W,暴力肯定过不去,我们须要预处理一些东西

首先我们知道,若x与y互质,则x+y与y也互质,x+2y与y也互质。。。

换到这道题上来说,若一个数x与m!互质,那么x+(m!)也一定与m!互质,(x+m!*2)也一定与m!互质。。。

因为n!一定是m!的倍数,于是我们每存在到一个x<=m!与m!互质,我们就一定能找到(n!)/(m!)个与m!互质的数

而m!以内与m!互质的数的数量恰好是φ(m!)

于是我们要得到的数恰好就是φ(m!)*(n!)/(m!) %p

当中m!的全部质因数恰好就是m以内全部的质数 于是φ(m!)=(m!)*∏(pi-1)/pi (pi<=m)

于是最后我们的结果就是n!*∏(pi-1)/pi

质数预处理出来,n!预处理出来,pi的逆元预处理出来,∏(pi-1)/pi就能够预处理出来,都是线性的

至于pi的逆元 有一个比較快的线性求法(详见 http://blog.csdn.net/whyorwhnt/article/details/19169035 )

我的代码最后交上去超时了1.5秒AC。。。并且我还不是最慢的,wulala大神比我还要慢200+MS。。。

  1. #include<bitset>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<algorithm>
  6. #define M 10000001
  7. using namespace std;
  8. typedef long long ll;
  9. bool not_prime[M+100];
  10. ll prime[500500],ans[M+100],fac[M+100],rev[M+100];
  11. int n,m,p,T,tot;
  12. void Linear_Shaker()
  13. {
  14. ll i,j;
  15. for(i=2;i<=M;i++)
  16. {
  17. if(!not_prime[i])
  18. prime[++tot]=i;
  19. for(j=1;j<=tot&&prime[j]*i<=M;j++)
  20. {
  21. not_prime[prime[j]*i]=1;
  22. if(i%prime[j]==0)
  23. break;
  24. }
  25. }
  26. fac[1]=1;
  27. for(i=2;i<=M;i++)
  28. fac[i]=fac[i-1]*i%p;
  29. rev[1]=1;
  30. for(i=2;i<=M&&i<p;i++)
  31. rev[i]=(p-p/i)*rev[p%i]%p;
  32. ans[1]=1;
  33. for(i=2;i<=M;i++)
  34. {
  35. if(!not_prime[i])
  36. ans[i]=ans[i-1]*(i-1)%p*rev[i%p]%p;
  37. else
  38. ans[i]=ans[i-1];
  39. }
  40. }
  41. int main()
  42. {
  43. scanf("%d%d",&T,&p);
  44. Linear_Shaker();
  45. for(int i=1;i<=T;++i)
  46. {
  47. scanf("%d%d",&n,&m);
  48. printf("%d\n",fac[n]*ans[m]%p);
  49. }
  50. }

BZOJ 2186 SDOI2008 沙拉公主的困惑 数论的更多相关文章

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

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

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

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

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

    题目链接:BZOJ - 2186 题目分析 题目要求出 [1, n!] 中有多少数与 m! 互质.(m <= n) 那么在 [1, m!] 中有 phi(m!) 个数与 m! 互质,如果一个数 ...

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

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

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

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

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

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

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

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

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

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

  9. 【BZOJ 2186】 2186: [Sdoi2008]沙拉公主的困惑 (欧拉筛,线性求逆元)

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

随机推荐

  1. Counting square

    Problem Description There is a matrix of size R rows by C columns. Each element in the matrix is eit ...

  2. hdu 1253 胜利大逃亡_三维

    第一次做三维的题,这题跑g++超时了,c++过了. #include<iostream> #include<cstdio> #include<queue> usin ...

  3. iOS开发-使用Storyboard进行界面跳转及传值

    前言:苹果官方是推荐我们将所有的UI都使用Storyboard去搭建,Storyboard也是一个很成熟的工具了.使用Storyboard 去搭建所有界面,我们可以很迅捷地搭建出复杂的界面,也就是说能 ...

  4. linux-FTP服务常用命令及测试

    一.vsftpd服务的安装,启动及关闭1.安装vsftpd[root@rusky bdump]# yum install vsftpd --必须配置yum源才能使用yum命令来安装vsftpd,或者挂 ...

  5. web项目中获取各种路径的方法

    ~Apple   web项目中各种路径的获取 1.可以在servlet的init方法里 String path = getServletContext().getRealPath("/&qu ...

  6. Android学习自定义Dialog

    Dialog是Android提供的各种对话框的基类,和上篇的DialogFragment类似.为什么还要介绍Dialog呢,因为DialogFragment只能运行在Android3.0以上的系统中. ...

  7. 百度地图SDk 使用

    第一步: 获取密钥 应用名称可以随便填写 发布版SHA1  的获取要在 keytool -v -list -keystore: C:\Users\admin\.android\debug.keysto ...

  8. 使用 Struts 2 实现国际化

    struts2国际化(I18N) 国际化也叫I18N,是Internationalization的简称.Struts2国际化是建立在Java国际化基础上,只是Struts2框架对Java国际化进行了进 ...

  9. .NET之反射(1)

    .NET之反射 第一版 内容摘要 前言 反射 查看元数据 加载程序集 晚期绑定 方法调用 反射.晚期绑定和自定义特性的使用背景 参考资料 前言 关于反射的内容,向来是隐藏在C#高级编程类别中的大部头书 ...

  10. python基础:名称空间与作用域

    Python的变量定义后都有自己的作用域,每个作用域内都有名字空间.名称空间就是变量名称与对象的关联关系.Python中使用变量名引用对象,需要使用该变量时,就在命名空间中进行搜索,获取对应的对象.从 ...