题意:互质的数的个数,其中

分析:因为,所以,我们很容易知道如下结论

   对于两个正整数,如果的倍数,那么中与互素的数的个数为

     本结论是很好证明的,因为中与互素的个数为,又知道,所以

结论成立。那么对于本题,答案就是

事实上只要把素数的逆元用exgcd求一求就好,其余并未用到

逆元递推法:

  1. #include<stdio.h>
  2. #include<string.h>
  3. const int N=1e7+;
  4. typedef long long ll;
  5. int pr[N],p[N],cnt,mod;
  6. int inv[N],ans1[N],ans2[N];
  7. int read()
  8. {
  9. int x=;char ch=getchar();
  10. while(ch<''||ch>'')ch=getchar();
  11. while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
  12. return x;
  13. }
  14. void init(){
  15. ans1[]=ans2[]=inv[]=;
  16. for(int i=;i<N;i++){
  17. ans1[i]=(ll)ans1[i-]*i%mod;
  18. if(!p[i])
  19. pr[++cnt]=i;
  20. for(int j=;j<=cnt&&i*pr[j]<N;j++){
  21. p[pr[j]*i]=;
  22. if(i%pr[j]==) break;
  23. }
  24. }
  25. for(int i=;i<N&&i<mod;i++){
  26. inv[i]=(mod-(ll)mod/i)*inv[mod%i]%mod;
  27. }
  28. for(int i=;i<N;i++){
  29. ans2[i]=ans2[i-];
  30. if(!p[i])
  31. ans2[i]=(ll)ans2[i]*(i-)%mod*inv[i%mod]%mod;
  32. }
  33. }
  34. int main(){
  35. int t,n,m;
  36. scanf("%d%d",&t,&mod);
  37. init();
  38. while(t--){
  39. n=read();m=read();
  40. printf("%d\n",(ll)ans1[n]*ans2[m]%mod);
  41. }
  42. return ;
  43. }

扩展欧几里德求逆元

  1. #include<stdio.h>
  2. #include<string.h>
  3. const int N=1e7+;
  4. typedef long long ll;
  5. int pr[N],p[N],cnt,mod;
  6. int inv[N],ans1[N],ans2[N];
  7. int read()
  8. {
  9. int x=;char ch=getchar();
  10. while(ch<''||ch>'')ch=getchar();
  11. while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
  12. return x;
  13. }
  14. int ex_gcd(int a,int b,int &x,int &y){
  15. if(!b){
  16. x=,y=;
  17. return a;
  18. }
  19. int ans=ex_gcd(b,a%b,y,x);
  20. y-=a/b*x;
  21. return ans;
  22. }
  23. int getinv(int i){
  24. int x,y;
  25. ex_gcd(i,mod,x,y);
  26. x=((x%mod)+mod)%mod;
  27. return x;
  28. }
  29. void init(){
  30. ans1[]=ans2[]=inv[]=;
  31. for(int i=;i<N;i++){
  32. ans1[i]=(ll)ans1[i-]*i%mod;
  33. if(!p[i])
  34. pr[++cnt]=i,inv[i]=getinv(i);
  35. for(int j=;j<=cnt&&i*pr[j]<N;j++){
  36. p[pr[j]*i]=;
  37. if(i%pr[j]==) break;
  38. }
  39. }
  40. for(int i=;i<N;i++){
  41. ans2[i]=ans2[i-];
  42. if(!p[i])
  43. ans2[i]=(ll)ans2[i]*(i-)%mod*inv[i%mod]%mod;
  44. }
  45. }
  46. int main(){
  47. int t,n,m;
  48. scanf("%d%d",&t,&mod);
  49. init();
  50. while(t--){
  51. n=read();m=read();
  52. printf("%d\n",(ll)ans1[n]*ans2[m]%mod);
  53. }
  54. return ;
  55. }

http://hzwer.com/5863.html

http://blog.csdn.net/acdreamers/article/details/8220787

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]沙拉公主的困惑

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

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

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

  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. [python拾遗]列表

    python列表拾遗 1.列表可以修改,使用 ‘+’ 将一个新列表附加在原列表的尾部: >>> a = [1,'a'] >>> b = a + [2,'b'] &g ...

  2. Linux 安装 Nginx

    1. nginx的安装: 开始学习如何安装nginx,首先安装必要的软件: # yum install libtool # yum install -y gcc-c++ # yum install z ...

  3. 开源项目Foq简介

        Foq是一个轻量级-线程安全的mocking类库.使用它来mock抽象类与接口这是我们通常的做法.Foq的名字来自Moq,如果你使用过Moq的话,自然后联想到它能做什么.Foq主要是为了F#的 ...

  4. <input type="text"/>未输入时属性value的默认值--js学习之路

    在百度ife刷题是自己的一个错误引发了我对<input type="text"/>的学习. 先贴代码: <!DOCTYPE html> <html&g ...

  5. Virtual DOM 算法

    前端 virtual-dom react.js javascript 目录: 1 前言 2 对前端应用状态管理思考 3 Virtual DOM 算法 4 算法实现 4.1 步骤一:用JS对象模拟DOM ...

  6. 实现跨域的N种方法

    从域说起 域: 域是WIN2K网络系统的安全性边界.我们知道一个计算机网最基本的单元就是"域",这一点不是WIN2K所独有的,但活动目录可以贯穿一个或多个域.在独立的计算机上,域即 ...

  7. CRM 2013 安装前系统和数据库的基础配置

    Win Serer 2012 域控安装参考:http://smallc.blog.51cto.com/926344/1034868  (其中最重要的几步:创建域控(ActiveDirectory域服务 ...

  8. arcgis python 更新顺序号

    i = 0def myFun(): global i i=i +1 return i myFun() ========================== accumulate(  ) total = ...

  9. SharePoint通过stsadm备份和还原子网站(不是网站集)

    大家都知道SharePoint的stsadm命令提供了很多便捷甚至是唯一的操作方法! 这里列出的所有命令:http://www.cnblogs.com/dadongzuo/archive/2013/0 ...

  10. 查看一个软件ipa包的内容

    1.打开itunes     下载你要用的app 把ipa文件拉到桌面上              然后进行压缩