题目描述

给出 N,K ,请计算下面这个式子:

\(∑_{i=1}^N∑_{j=1}^Nsgcd(i,j)^k\)

其中,sgcd(i, j)表示(i, j)的所有公约数中第二大的,特殊地,如果gcd(i, j) = 1, 那么sgcd(i, j) = 0。

考虑到答案太大,请输出答案对2^32取模的结果.

1≤N≤109,1≤K≤50

样例解释:

因为gcd(i, j)=1时sgcd(i,j)=0对答案没有贡献,所以我们只考虑gcd(i,j)>1的情况.

当i是2时,j是2时,sgcd(i,j)=1,它的K次方是1

当i是2时,j是4时,sgcd(i,j)=1,它的K次方是1

当i是3时,j是3时,sgcd(i,j)=1,它的K次方是1

当i是4时,j是2时,sgcd(i,j)=1,它的K次方是1

当i是4时,j是4时,sgcd(i,j)=2,它的K次方是8

当i是5时,j是5时,sgcd(i,j)=1,它的K次方是1

解题思路

设minp(x)表示x最小的质因子(当x等于1时,minp(x)为0,当x质数时,minp(x)为1)。

于是

\[∑_{i=1}^n∑_{j=1}^nsgcd(i,j)^k
\]

\[=\sum_{d=2}^{n}\frac{d}{minp(d)}∑^{\lfloor {\frac{n}{d}} \rfloor}_{i=1}∑^{\lfloor {\frac{n}{d}} \rfloor}_{j=1}[sgcd(i,j)==1]
\]

\[=\sum_{d=2}^{n}\dfrac{d}{minp(d)}(2∑^{\lfloor {\frac{n}{d}} \rfloor}_{i=1}φ(i)−1)
\]

对于\(phi(i)\)的前缀和就可以直接杜教筛。

至于如何求出\(\dfrac{d}{minp(d)}\),

当\(d>\sqrt n 且 d为质数\)时,\(\dfrac{d}{minp(d)}\)为1。

这个就可以通过求\(>\sqrt n\)的质数来得出。

我们设

\(F(i,j)表示在[1,j]中,不能被前i个质数整除的数的K次方和\)

\(H(i,j)表示在[1,j]中,不能被前i个质数整除的数的个数\)

\(G(i,j)表示所有x∈[1,j],minp(x)≤p_i,\frac{d}{minp(d)}^K的和\)

于是,我们可以的出一个递推式

\(F(i,j)=F(i-1,j)-p_i^kF(i-1,\lfloor\dfrac{j}{p_i}\rfloor)\)

\(H(i,j)=H(i-1,j)-H(i-1,\lfloor\dfrac{j}{p_i}\rfloor)\)

\(G(i,j)=G(i-1,j)+F(i-1,\lfloor\dfrac{j}{p_i}\rfloor)\)

答案就是\(H(\sqrt n以内质数个数,n)+G(\sqrt n以内质数个数,n)\)

然后我们发现,当\(p_i>j\)时,F(i,j)=1,H(i,j)=1;

当\(p_i^2>j\)时

\(F(i,j)=F(i-1,j)-p_i^k\)

\(H(i,j)=H(i-1,j)-1\)

\(G(i,j)=G(i-1,j)+1\)

因为j只有\(\sqrt n\)种取值,我们直接预处理出每种取值,然后直接递推。

  1. #include <cmath>
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <cstdlib>
  5. #include <cstring>
  6. #include <algorithm>
  7. #include <queue>
  8. #include <map>
  9. const long long inf=2147483647;
  10. const int mo=1e9+7;
  11. const int N=1000005;
  12. const int M=55;
  13. using namespace std;
  14. typedef unsigned int uint;
  15. #define sqr(x) ((x)*(x))
  16. long long _n[N],num,p[N],qn,n,m,SP[N],v1[N],phi[N],nphi[N],nn;
  17. uint F[N],G[N],H[N],lu[N],mi[N],smi[N],s[M][M],S[M],ans,Smi[N];
  18. bool bz[N];
  19. uint poww(uint x,uint y)
  20. {
  21. uint s=1;
  22. for(;y;y>>=1,x=x*x)
  23. if(y&1) s=s*x;
  24. return s;
  25. }
  26. void pre_P()
  27. {
  28. mi[1]=phi[1]=1;
  29. for(int i=2;i<=qn;i++)
  30. {
  31. if(!bz[i])
  32. {
  33. p[++p[0]]=i,phi[i]=i-1,mi[i]=poww(i,m),smi[p[0]]=smi[p[0]-1]+mi[i];
  34. }
  35. for(int j=1;j<=p[0];j++)
  36. {
  37. int k=i*p[j];
  38. if(k>qn) break;
  39. bz[k]=true;
  40. mi[k]=mi[i]*mi[p[j]];
  41. if(i%p[j]==0)
  42. {
  43. phi[k]=phi[i]*p[j];
  44. break;
  45. }
  46. else phi[k]=phi[i]*(p[j]-1);
  47. }
  48. }
  49. for(int i=1;i<=qn;i++) Smi[i]=Smi[i-1]+mi[i],phi[i]+=phi[i-1];
  50. }
  51. void pre_STR()
  52. {
  53. for(int i=0;i<=m;i++) s[i][i]=1;
  54. for(int i=1;i<=m;i++)
  55. for(int j=1;j<i;j++) s[i][j]=s[i-1][j-1]+s[i-1][j]*(i-1);
  56. }
  57. uint get_P(uint n,uint k)
  58. {
  59. uint val=1;
  60. for(uint i=n;i>=n-k+1;i--)
  61. if(i%k==0) val*=i/k;
  62. else val*=i;
  63. return val;
  64. }
  65. void pre()
  66. {
  67. for(uint i=1,last=1;i<=n;i=last+1) last=n/(n/i),_n[++num]=n/i;
  68. reverse(_n+1,_n+1+num);
  69. pre_P(),pre_STR();
  70. for(int i=1;i<=num;i++)
  71. {
  72. H[i]=_n[i];
  73. if(_n[i]<=qn)
  74. {
  75. F[i]=Smi[_n[i]];
  76. continue;
  77. }
  78. S[0]=_n[i];
  79. for(int k=1;k<=m;k++)
  80. {
  81. S[k]=get_P(_n[i]+1,k+1);
  82. for(int j=0;j<k;j++) S[k]-=((k-j)&1?-1:1)*s[k][j]*S[j];
  83. }
  84. F[i]=S[m];
  85. }
  86. }
  87. uint get_F(long long i,long long j)
  88. {
  89. long long k;
  90. k=j<=qn?j:(num-n/j+1);
  91. return (!i || sqr(p[i])<=j)?F[k]:(p[i]<=j?(F[k]-smi[i]+smi[lu[k]]):1);
  92. }
  93. uint get_H(long long i,long long j)
  94. {
  95. long long k;
  96. k=j<=qn?j:(num-n/j+1);
  97. return (!i || sqr(p[i])<=j)?H[k]:(p[i]<=j?(H[k]-i+lu[k])%mo:1);
  98. }
  99. uint Sphi(int n)
  100. {
  101. if(n<=qn) return phi[n];
  102. if(nphi[nn/n]) return nphi[nn/n];
  103. uint ans=(n&1)?((n+1)>>1)*n:(n>>1)*(n+1);
  104. for(int i=2,last=1;i<=n;i=last+1)
  105. {
  106. last=n/(n/i);
  107. ans-=Sphi(n/i)*(last-i+1);
  108. }
  109. return nphi[nn/n]=ans;
  110. }
  111. int main()
  112. {
  113. scanf("%lld%lld",&n,&m),qn=sqrt(n);
  114. pre();
  115. for(int i=1;i<=p[0];i++)
  116. {
  117. for(int j=num;j>=1;j--)
  118. {
  119. F[j]-=mi[p[i]]*get_F(i-1,_n[j]/p[i]);
  120. G[j]+=get_F(i-1,_n[j]/p[i]);
  121. H[j]-=get_H(i-1,_n[j]/p[i]);
  122. lu[j]=i;
  123. if(i==p[0] || sqr(p[i+1])>_n[i])
  124. v1[j]=G[j]+H[j]-1;
  125. if(sqr(p[i])>_n[j-1])
  126. {
  127. v1[j]=G[j]+H[j]-1;
  128. break;
  129. }
  130. }
  131. }
  132. v1[2]=1;
  133. if(_n[3]==3) v1[3]=2;
  134. ans=0;
  135. nn=n;
  136. for(int i=2;i<=num;i++)
  137. ans=ans+(v1[i]-v1[i-1])*(2*Sphi(n/_n[i])-1);
  138. cout<<ans<<endl;
  139. return 0;
  140. }

【51nod 1847】奇怪的数学题的更多相关文章

  1. [51nod 1847]奇怪的数学题

    [ 51nod 1847 ]奇怪的数学题 题目   点这里看题目. 分析   是挺奇怪的......   以下定义质数集合为\(P\),\(p_i\)为第\(i\)个质数.   定义\(mp(x)\) ...

  2. 【51NOD 1847】奇怪的数学题(莫比乌斯反演,杜教筛,min_25筛,第二类斯特林数)

    [51NOD 1847]奇怪的数学题(莫比乌斯反演,杜教筛,min_25筛,第二类斯特林数) 题面 51NOD \[\sum_{i=1}^n\sum_{j=1}^nsgcd(i,j)^k\] 其中\( ...

  3. 【51nod 1874】 奇怪的数学题

    题目 求 \[\sum_{i=1}^n\sum_{j=1}^nsgcd(i,j)^k\] 首先这个次大公约数显然就是\(gcd\)除一下最小质因子了 于是 \[\sum_{i=1}^n\sum_{j= ...

  4. 51nod 1965 奇怪的式子——min_25筛

    题目:http://www.51nod.com/Challenge/Problem.html#!#problemId=1965 考虑 \( \prod_{i=1}^{n}\sigma_0^i \) \ ...

  5. [51nod1847]奇怪的数学题

    description 51nod 求\[\sum_{i=1}^{n}\sum_{j=1}^{n}sgcd(i,j)^k\]其中\(sgcd(i,j)\)表示\(i,j\)的次大公约数,如果\(gcd ...

  6. 51nod 1965 奇怪的式子 —— min_25筛

    题目:http://www.51nod.com/Challenge/Problem.html#!#problemId=1965 推式子就同这里:https://www.cnblogs.com/yoyo ...

  7. 【51NOD1847】奇怪的数学题 min_25筛

    题目描述 记\(sgcd(i,j)\)为\(i,j\)的次大公约数. 给你\(n\),求 \[ \sum_{i=1}^n\sum_{j=1}^n{sgcd(i,j)}^k \] 对\(2^{32}\) ...

  8. 【51nod1847】 奇怪的数学题

    就当我是 A 了此题吧... 首先预备知识有点多(因为题目要处理的东西都挺毒瘤): 杜教筛运用(当然你可以用其他筛?) 第二类斯特林数相关定理 下降阶乘幂相关定理 min25 筛运用 好了可以关掉本题 ...

  9. 【51Nod1847】奇怪的数学题

    ​ 记\(f(x)=\)\(x\)的次大因数,那么\(sgcd(i,j)=f(gcd(i,j))\). 下面来推式子: \[ \begin{aligned} \sum_{i=1}^n\sum_{j=1 ...

随机推荐

  1. jstl与EL表达式

    一·el表达式介绍 EL 全名为Expression Language EL 语法很简单,它最大的特点就是使用上很方便.接下来介绍EL主要的语法结构: ${sessionScope.user.sex} ...

  2. C++变量的声明和定义

    1.变量的定义:变量的定义用于为变量分配存储控件,还可以为变量指定初始值.在一个程序中,变量有且仅有一个定义. 2.变量的声明:用于向程序表名变量的类型和名字.程序中变量可以声明多次,但只能定义一次. ...

  3. PAT A1042 Shuffling Machine

    自己思路,没通过 #include <cstdio> #define N 54 int main() { #ifdef ONLINE_JUDGE #else freopen("1 ...

  4. 从入门到自闭之Python--MySQL数据库的单表操作

    单表查询:select * from 表 where 条件 group by 分组 having 过滤 order by 排序 limit n; 语法: select distinct 字段1,字段2 ...

  5. Django-choices字段值对应关系(性别)-MTV与MVC科普-Ajax发json格式与文件格式数据-contentType格式-Ajax搭配sweetalert实现删除确认弹窗-自定义分页器-批量插入-07

    目录 models 字段补充 choices 参数/字段(用的很多) MTV与MVC模型 科普 Ajax 发送 GET.POST 请求的几种常见方式 用 Ajax 做一个小案例 准备工作 动手用 Aj ...

  6. MySQL5.7主从-GTID-mysqldump,xtrabackup搭建

    1.两个空库,都是row+gtid,版本为MySQL5.7.22mydb1执行:(dba_user@localhost) [(none)]> show master status;+------ ...

  7. 运用加密技术保护Java源代码(转)

    出处:运用加密技术保护Java源代码 为什么要加密? 对于传统的C或C++之类的语言来说,要在Web上保护源代码是很容易的,只要不发布它就可以.遗憾的是,Java程序的源代码很容易被别人偷看.只要有一 ...

  8. 关于HA(2.102 -2.103 服务器排障)

    关于处理RHCA故障的报告: ,2.102 和 2.103 两台机器在重启之后拉不起来 原因是这两台服务比较怪 先要启动service rpcbind restart 然后再要起service nfs ...

  9. Java 里 如何使用Base64,网上都是废物的说法

    百度搜索Java里如何使用Base64,结果很多文章都是让引用第三方Jar包,我靠我想了一下 他妈的Java里连这个都不提供,就直接忽略里那些废物的文章.继续搜索,算是找到答案: Java8以后 官方 ...

  10. Nginx如何配置防盗链

    配置要点 none : 允许没有http_refer的请求访问资源: blocked : 允许不是http://开头的,不带协议的请求访问资源: 119.28.190.215 start.igrow. ...