题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3481

推式子:xy % P = Q 的个数

由于 0 <= x,y < P,所以对于一个固定的 x,如果 (x,P) | Q,则有 (x,P) 个解;

所以个数为 ∑(0 <= x < P ) (x,P) * [ (x,P) | Q ]  ( [...] 表示 ... 为真则为1,否则为0)

= ∑( d|P, d|Q ) d * φ( P/d )

令 Q = (P,Q),则

= ∑( d|Q ) d * φ( P/d )

单独考虑每个质因子的贡献,若P = p1 ^ t1 * p2 ^ t2 * ... pm ^ tm,Q = p1 ^ k1 * p2 ^ k2 * ... * pm ^ km,则原式

= ∏( 1 <= i <= m ) ∑( 0 <= x <= k[i] ) pi * φ(pi^ti-x)

而 φ(pi^ti) = pi^ti * ( pi - 1 ) / pi

所以原式最终变成 ∏( 1 <= i <= m ) pi^(ti-1) * ( pi - 1 ) * ( ki + 1 )

注意 t[i] = k[i] 时略有不同,求和的那一项 = pi , 所以如果有 t[i] = k[i],则再加一个 pi^(ti-1);

然后...质因数分解要用 Pollar_rho,Pollard_rho 内又用到 Miller-Rabin,参考了一下博客:

https://blog.csdn.net/sunshine_cfbsl/article/details/52512706

https://www.cnblogs.com/kuangbin/archive/2012/08/19/2646396.html

https://blog.csdn.net/forever_shi/article/details/80547041

套上板子就可以了;

但要注意,如果把 P 和 Q 的所有质因子都提取出来会 TLE,因为令 Q = (P,Q),所以只有 Q 有的质因子就不用专门记录下来了;

直接 rand() 似乎只能得到 int,所以可以专门写一下 ll 的,虽然只有 int 好像也可以;

注意各处都是 ll 。

代码如下:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<ctime>
  6. using namespace std;
  7. typedef long long ll;
  8. int const xn=;
  9. int m,S=,t[xn],k[xn];
  10. ll pri[xn],ans;
  11. ll rd()
  12. {
  13. ll ret=,f=; char ch=getchar();
  14. while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
  15. while(ch>=''&&ch<='')ret=(ret<<3ll)+(ret<<1ll)+ch-'',ch=getchar();
  16. return f?ret:-ret;
  17. }
  18. ll Rand(ll n)
  19. {
  20. return (((ll)rand()<<)|rand())%(n-)+;
  21. // return rand()%(n-1)+1;//也可,但无ll
  22. }
  23. ll upt(ll x,ll mod){while(x>=mod)x-=mod; while(x<)x+=mod; return x;}
  24. ll mul(ll a,ll b,ll mod)
  25. {
  26. ll ret=; a=a%mod; b=b%mod;
  27. for(;b;b>>=1ll,a=upt(a+a,mod))
  28. if(b&)ret=upt(ret+a,mod);
  29. return ret;
  30. }
  31. ll pw(ll a,ll b,ll mod)
  32. {
  33. ll ret=; a=a%mod;
  34. for(;b;b>>=1ll,a=mul(a,a,mod))
  35. if(b&)ret=mul(ret,a,mod);
  36. return ret;
  37. }
  38. ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
  39. bool ck(ll a,ll u,ll t,ll p)
  40. {
  41. ll x=pw(a,u,p),lst=x;
  42. for(int i=;i<=t;i++)
  43. {
  44. x=mul(x,x,p);
  45. if(x==&&lst!=&&lst!=p-)return ; // a^2 % p = 1 -> a=1,a=p-1
  46. lst=x;
  47. }
  48. if(x!=)return ; // a^p-1 % p = 1
  49. return ;
  50. }
  51. bool MR(ll x)
  52. {
  53. if(x<=||x&==)return ;
  54. if(x==)return ;
  55. ll t=,u=x-;
  56. while(u&==)u>>=1ll,t++;
  57. for(int i=;i<=S;i++)
  58. {
  59. ll a=Rand(x)%(x-)+;
  60. if(!ck(a,u,t,x))return ;
  61. }
  62. return ;
  63. }
  64. ll rho(ll n,ll c)
  65. {
  66. ll x=Rand(n)%n,y=x;
  67. ll i=,k=;
  68. while()
  69. {
  70. i++;
  71. x=(mul(x,x,n)+c)%n;
  72. ll d=gcd((x-y+n)%n,n);
  73. if(d!=&&d!=n)return d;
  74. if(x==y)return n;
  75. if(i==k)y=x,k+=k;
  76. }
  77. }
  78. void add(ll x,bool tp)//1:P-t[]
  79. {
  80. for(int i=;i<=m;i++)
  81. if(pri[i]==x)
  82. {
  83. if(tp)t[i]++; else k[i]++;
  84. return;
  85. }
  86. if(!tp)return;//否则TLE!!!
  87. pri[++m]=x;
  88. if(tp)t[m]++; else k[m]++;
  89. }
  90. void find(ll x,bool tp)
  91. {
  92. if(x==)return;//!
  93. if(MR(x)){add(x,tp); return;}
  94. ll p=x;
  95. while(p>=x)p=rho(p,Rand(x)%(x-)+);
  96. find(p,tp); find(x/p,tp);
  97. }
  98. int main()
  99. {
  100. srand();//或 time(0);
  101. int mod=1e9+;
  102. int n=rd(); ll x; bool fl=;
  103. for(int i=;i<=n;i++)x=rd(),find(x,);//1:P-t[]
  104. for(int i=;i<=n;i++)
  105. {
  106. x=rd();
  107. if(!x){fl=; continue;}
  108. else find(x,);
  109. }
  110. if(fl)for(int i=;i<=m;i++)k[i]=t[i];
  111. else for(int i=;i<=m;i++)k[i]=min(k[i],t[i]);//(P,Q)
  112. ans=;
  113. for(int i=;i<=m;i++)
  114. {
  115. ll pp=pw(pri[i],t[i]-,mod);
  116. ll mm=mul(pri[i]-,k[i]+,mod);
  117. if(k[i]==t[i])mm++;
  118. ans=mul(ans,mul(pp,mm,mod),mod);
  119. }
  120. printf("%lld\n",ans);
  121. return ;
  122. }

bzoj 3481 DZY loves math —— 反演+Pollard_rho分解质因数的更多相关文章

  1. bzoj 3481 DZY Loves Math III——反演+rho分解质因数

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3481 推推式子发现:令Q=gcd(P,Q),ans=Σ(d|Q) d*phi(P/d).把 ...

  2. bzoj 3309 DZY Loves Math——反演+线性筛

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3309 像这种数据范围,一般是线性预处理,每个询问 sqrt (数论分块)做. 先反演一番.然 ...

  3. ●BZOJ 3309 DZY Loves Math

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3309 题解: 莫比乌斯反演,线筛 化一化式子: f(x)表示x的质因子分解中的最大幂指数 $ ...

  4. BZOJ 3561 DZY Loves Math VI

    BZOJ 3561 DZY Loves Math VI 求\(\sum_{i=1}^{n}\sum_{j=1}^{m}\text{lcm}(i,j)^{\gcd(i,j)}\),钦定\(n\leq m ...

  5. bzoj 3309 DZY Loves Math 莫比乌斯反演

    DZY Loves Math Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1303  Solved: 819[Submit][Status][Dis ...

  6. BZOJ 3309: DZY Loves Math

    3309: DZY Loves Math Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 761  Solved: 401[Submit][Status ...

  7. BZOJ 3512: DZY Loves Math IV [杜教筛]

    3512: DZY Loves Math IV 题意:求\(\sum_{i=1}^n \sum_{j=1}^m \varphi(ij)\),\(n \le 10^5, m \le 10^9\) n较小 ...

  8. bzoj 3462: DZY Loves Math II

    3462: DZY Loves Math II Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 211  Solved: 103[Submit][Sta ...

  9. BZOJ 3309 DZY Loves Math ——莫比乌斯反演

    枚举$d=gcd(i,j)$ 然后大力反演 ——来自Popoqqq的博客. 然后大力讨论后面的函数的意义即可. http://blog.csdn.net/popoqqq/article/details ...

随机推荐

  1. 【Kubernetes】Kubernetes的Service外部访问方式:NodePort和LoadBalancer

    Kubernetes的Pod的寿命是有限的,它们不会复活,因此尽管每个Pod都有自己的IP地址,但是这些IP地址是不可靠的,会随着Pod的消亡而消失. 这就带来一个问题,如果一些Pod的集合(称之为b ...

  2. 1010. Radix (25)(出错较多待改进)

    Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The an ...

  3. UVA 11090 判负圈问题

    题目链接http://vjudge.net/problem/viewProblem.action?id=34650 题目大意: 给定n个点m条边的加权有向图,求平均权值最小的回路.平均权值=路径权值之 ...

  4. ascii 和 byte以及UTF-8的转码规则

    多年来闲麻烦,只记录笔记,不曾编写BLOG,本文为原创,如需转载请标明出处 废话不说,直奔主题 ascii     计算机只接受 “高”.“低”电压,所以使用二进制  1  和  0 分别代表高低电压 ...

  5. python学习之-- random模块

    random模块random.random():随机打印一个小数random.randint(1,10):随机打印1-10之间的任意数字(包括1和10)random.randrange(1,10):随 ...

  6. python字符串连接方法效率比较

    方法1:直接通过加号(+)操作符连接 1 website = 'python' + 'tab' + '.com' 方法2:join方法 1 2 listStr = ['python', 'tab',  ...

  7. 为Java说句公道话

    为Java说句公道话 有些人问我,在现有的语言里面,有什么好的推荐?我说:"Java. " 他们非常吃惊:"什么?Java!" 所以我如今来解释一下. Java ...

  8. VS2015 android 设计器不能可视化问题解决。

    近期安装了VS2015,体验了一下android 的开发,按模板创建执行了个,试下效果非常不错.也能够可视化设计.但昨天再次打开或创建一个android程序后,设计界面直接不能显示,显示错误:(可能是 ...

  9. 区分Integer.getInteger和Integer.valueOf、Integer.parseInt() 的使用方法

    Integer类有两个看起来很类似的静态方法,一个是Integer.getInteger(String),另外一个是Integer.valueOf(String).如果只看方法名称的话,很容易将这两个 ...

  10. 《The Swift Programming Language》的笔记-第27页

    页 1 type safelanguage 本页的主要内容是说swift语言是"类型检查"的安全型编程语言.意思是赋值语句的左值和右值的类型要一致,左值声明是string型变量那么 ...