​   

  

  记\(f(x)=\)\(x\)的次大因数,那么\(sgcd(i,j)=f(gcd(i,j))\)。

  

  下面来推式子:

\[\begin{aligned}
\sum_{i=1}^n\sum_{j=1}^nsgcd(i,j)^k&=\sum_{i=1}^n\sum_{j=1}^nf(gcd(i,j))^k&记d=gcd(i,j)\\
&=\sum_{d=1}^nf(d)^k\sum_{\frac i d=1}^{\lfloor \frac n d\rfloor}\sum_{\frac j d=1}^{\lfloor \frac n d\rfloor}[gcd(\frac i d,\frac j d)=1]&f(1)=0\\
&=\sum_{d=2}^nf(d)^k\sum_{i=1}^{\lfloor \frac n d\rfloor}\sum_{j=1}^{\lfloor \frac n d\rfloor}[gcd(i,j)=1]\\
&=\sum_{d=2}^nf(d)^k(2\sum_{i=1}^{\lfloor \frac n d\rfloor}\varphi(i)-1)
\end{aligned}
\]

  最后一步的括号是用欧拉函数的定义直接替换出来的。

  

​  我们发现,可以按\(\lfloor \frac n d \rfloor\)的取值数论分段,因为括号显然只受\(\lfloor \frac n d\rfloor\)的取值影响,关键是如何求\(f(x)^k\)的前缀和?

  

​  记\(S_x=\sum_{i=2}^xf(x)^k\),

  

​  令min_25中的\(g\)数组以\(s(x)=x^k\)的定义计算\(g\),考虑由\(g_{i,j-1}\)推到\(g_{i,j}\)的时候,减去的是什么?是\(s(p_j)*(g_{\lfloor\frac n {p_j}\rfloor,j-1}-g_{p_j-1,j-1})\),后面括号的部分是什么呢?恰好是那些最小质因子为\(p_j\)且除去\(p_j\)后剩余部分最小质因数不小于\(p_j\)的数的\(k\)次方之和,我们发现这些数的\(f\)值之和就是后面的括号。又因为每一个数至多被如此枚举到1次,所以对于每一个\(i\),我们把括号的值累加起来,这就是那些\([2,i]\)中非质数的\(f\)值之和;再加上\([2,i]\)中的质数的\(f\)值之和,也就是质数个数,我们就求得了\(S_i\)。

  

  min_25真牛逼。

  

  所以就做完了,\(g\)的初始化需要用到自然数幂求和,考虑到\(k\)比较小,可以用第二类斯特林数求解。

\[\begin{aligned}
Sum_k(n)&=\sum_{i=1}^ni^k\\
&=\sum_{j=1}^k\begin{Bmatrix}k\\j\end{Bmatrix}\frac{{(n+1)}^\underline{j+1}}{j+1}
\end{aligned}
\]

  

  

Code

  

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <algorithm>
  4. #include <map>
  5. using namespace std;
  6. typedef long long ll;
  7. typedef unsigned int ui;
  8. typedef map<ll,ui> mlu;
  9. const int SQRTN=32000,LEN=1000001;
  10. bool vis[LEN];
  11. ui p[LEN],pcnt,pphi[LEN],s[51][51],pk[LEN];
  12. ll n,k,sqrtn,m;
  13. ll a[SQRTN*2],cnt,pos1[SQRTN],pos2[SQRTN];
  14. ui g[SQRTN*2],sum[SQRTN*2],g1[SQRTN*2];
  15. mlu record;
  16. ui ksm(ui x,int y){
  17. ui res=1;
  18. for(;y;x=x*x,y>>=1)
  19. if(y&1) res=res*x;
  20. return res;
  21. }
  22. void prework(){
  23. pphi[1]=1;
  24. for(int i=2;i<LEN;i++){
  25. if(!vis[i]){
  26. p[++pcnt]=i;
  27. pphi[i]=i-1;
  28. }
  29. for(int j=1;j<=pcnt&&i*p[j]<LEN;j++){
  30. int x=i*p[j];
  31. vis[x]=true;
  32. if(i%p[j]==0){
  33. pphi[x]=pphi[i]*p[j];
  34. break;
  35. }
  36. pphi[x]=pphi[i]*(p[j]-1);
  37. }
  38. }
  39. for(int i=2;i<LEN;i++) pphi[i]+=pphi[i-1];
  40. s[0][0]=s[0][1]=1;
  41. for(int i=1;i<=50;i++){
  42. s[i][1]=1;
  43. for(int j=2;j<=i;j++)
  44. s[i][j]=s[i-1][j]*(ui)j+s[i-1][j-1];
  45. }
  46. }
  47. inline int gp(ll x){
  48. return x<=sqrtn?pos1[x]:pos2[n/x];
  49. }
  50. void Diz(){
  51. for(ll i=1,j;i<=n;i=j+1){
  52. j=n/(n/i);
  53. a[++cnt]=n/i;
  54. }
  55. reverse(a+1,a+1+cnt);
  56. for(int i=1;i<=cnt;i++)
  57. if(a[i]<=sqrtn) pos1[a[i]]=i;
  58. else pos2[n/a[i]]=i;
  59. }
  60. ui sumup(ll l,ll r){
  61. ll a=l+r,b=r-l+1;
  62. if(a&1) b/=2; else a/=2;
  63. return (ui)a*(ui)b;
  64. }
  65. ui getPhi(ll n){
  66. if(n<LEN) return pphi[n];
  67. mlu::iterator pos=record.find(n);
  68. if(pos!=record.end()) return pos->second;
  69. ui res=sumup(1,n);
  70. for(ll i=2,j;i<=n;i=j+1){
  71. j=n/(n/i);
  72. res-=getPhi(n/i)*(j-i+1);
  73. }
  74. record[n]=res;
  75. return res;
  76. }
  77. ui getSumk(ll n){
  78. ui res=0,t;
  79. for(ll j=1;j<=k;j++){
  80. t=1;
  81. int md=(n-j+1)%(j+1);
  82. for(ll i=n-j+1;i<=n+1;i++,md++)
  83. if(!md||md==(j+1)) t*=(ui)i/(j+1);
  84. else t*=(ui)i;
  85. res+=t*s[k][j];
  86. }
  87. return res;
  88. }
  89. void calc_g(){
  90. for(int i=2;i<=cnt;i++) g[i]=getSumk(a[i])-1,g1[i]=a[i]-1,sum[i]=0;
  91. for(int j=1;j<=m;j++)
  92. for(int i=cnt;i>=2&&a[i]>=p[j]*p[j];i--){
  93. g1[i]-=g1[gp(a[i]/p[j])]-g1[gp(p[j]-1)];
  94. ui delta=(g[gp(a[i]/p[j])]-g[gp(p[j]-1)]);
  95. g[i]-=pk[j]*delta;
  96. sum[i]+=delta;
  97. }
  98. }
  99. ui calc(ll n){
  100. return sum[gp(n)]+g1[gp(n)];
  101. }
  102. int main
  103. prework();
  104. scanf("%lld%lld",&n,&k);
  105. sqrtn=(ll)sqrt(n);
  106. m=upper_bound(p+1,p+1+pcnt,sqrtn)-p-1;
  107. for(int i=1;i<=m;i++) pk[i]=ksm(p[i],k);
  108. Diz();
  109. calc_g();
  110. ui ans=0,last=0,tmp;
  111. for(ll i=2,j;i<=n;i=j+1){
  112. j=n/(n/i);
  113. tmp=calc(j);
  114. ans+=(getPhi(n/i)*2-1)*(tmp-last);
  115. last=tmp;
  116. }
  117. printf("%lu\n",ans);
  118. return 0;
  119. }

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

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

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

  2. 51nod1847 奇怪的数学题 (Min_25筛+第二类斯特林数)

    link \(\sum_{i=1}^n\sum_{j=1}^n\mathrm{sgcd}(i,j)^k=\sum_{p=1}^ns(p)^k\sum_{i=1}^n\sum_{j=1}^n[\gcd( ...

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

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

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

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

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

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

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

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

  7. 51NOD1847:奇怪的数学题

    传送门 Sol 设 \(f(d)\) 表示 \(d\) 所有约数中第二大的,\(low_d\) 表示 \(d\) 的最小质因子 \[f(d)=\frac{d}{low_d}\] 那么 \[\sum_{ ...

  8. 【51nod1847】奇怪的数学题(Min_25筛+杜教筛)

    题面 传送门 题解 这题有毒--不知为啥的错误调了半天-- 令\(f(i)={sgcd(i)}\),那么容易看出\(f(i)\)就是\(i\)的次大质因子,用\(i\)除以它的最小质因子即可计算 于是 ...

  9. 【51nod 1847】奇怪的数学题

    题目描述 给出 N,K ,请计算下面这个式子: \(∑_{i=1}^N∑_{j=1}^Nsgcd(i,j)^k\) 其中,sgcd(i, j)表示(i, j)的所有公约数中第二大的,特殊地,如果gcd ...

随机推荐

  1. jenkins的时间与服务器的时间不一致

    解决办法:

  2. 小球下落(Dropping Balls, Uva 679)

    题目描述 有一棵二叉树,最大深度为D,且所有的叶子深度都相同.所有结点从上到下从左到右编号为1,2,3,-,2eD-1.在结点1处放一个小球,它会往下落.每个结点上都有一个开关,初始全部关闭,当每次有 ...

  3. 无法连接 Plugins Market 失效的日子

    一.问题背景 不知道是什么原因,我的 Intellij 连接不上 Plugins Market,这时候我需要使用 @Data 注解来自动生成 Getter.Setter 方法.在添加了相应的依赖之后, ...

  4. RabbitMQ基础使用之集群构建

    简介 RabbitMQ是基于Erlang开发的一种消息队列服务,本篇文章主要部署三台机器用来实现集群的普通模式与镜像模式!欢迎大家吐槽交流学习! 特点 集群节点包括内存节点和磁盘节点,有了磁盘节点就支 ...

  5. 第十周psp作业

    本周psp 本周进度条 代码累积折线图 博文字数累积折线图 饼状图

  6. java把map转json

    JSONUtils.toJSONString(requestMap);    com.alibaba.fastjson.JSON <!-- https://mvnrepository.com/a ...

  7. Fourteenth scrum meeting

    闫昊 今日完成:整理上一阶段代码,规划第二阶段实施过程 明日完成:学习讨论区开发 唐彬 今日完成:整理上一阶段代码,规划第二阶段实施过程 明日完成:学习学习进度部分开发 史烨轩 今日完成:整理上一阶段 ...

  8. YQCB绩效表

    标准 队员 工作质量 20% 工作态度 20% 工作量 30% 工作难易程度 20% 团队意识 10% 总分 陈美琪 17 18 28 19 9 91 张晨阳 16 16 25 17 9 83 刘昭为 ...

  9. 使用sqlyog创建数据库的错误

    1.错误代码: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL s ...

  10. Sprint2

    进展:主要进行了在安卓手机端进行APP开发的资料及有关学习的视频的查找等.了解也学习了这些资料还有技术.第一个任务完成了一半. 燃尽图: