@description@

求:

\[\sum_{i=1}^{n}\sum_{j=1}^{n}gcd^k(i, j)\times lcm(i, j)\times [gcd(i, j) \in prime] \mod 10^9 + 7
\]

原题传送门。

@solution@

\[\begin{aligned}
ans &= \sum_{i=1}^{n}\sum_{j=1}^{n}gcd^k(i, j)\times lcm(i, j)\times [gcd(i, j) \in prime] \\
&= \sum_{d=1}^{n}[d \in prime]\times d^{k+1}\sum_{i=1}^{\lfloor \frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor \frac{n}{d}\rfloor}[gcd(i, j) = 1]\times i \times j
\end{aligned}
\]

后面那个是经典问题了。虽然明显可以莫比乌斯反演,不过注意到 i, j 取值范围相同,可以用欧拉函数。

基于结论 \(gcd(i, n) = gcd(n - i, n)\),与 n 互质的数总是成对存在,所以有:

\[\sum_{i=1}^{n}\sum_{j=1}^{n}[gcd(i, j) = 1]\times i \times j = \sum_{i=1}^{n}\phi(i)\times i^2
\]

记 \(S(n) = \sum_{i=1}^{n}\phi(i)\times i^2\),可以用杜教筛求 \(S\)(能不用 min-25 筛就不用)。则:

\[ans = \sum_{d=1}^{n}[d \in prime]\times d^{k+1}\times S(\lfloor \frac{n}{d}\rfloor)
\]

如果对 \(S(\lfloor \frac{n}{d}\rfloor)\) 分块,我们需要求质数的 k + 1 次幂的前缀和。其实就是 min-25 筛的前半部分。

@accepted code@

  1. #include <cstdio>
  2. #include <algorithm>
  3. using namespace std;
  4. typedef long long ll;
  5. const int MOD = int(1E9) + 7;
  6. const int MAXN = 4650000;
  7. inline int add(int x, int y) {return (x + y >= MOD ? x + y - MOD : x + y);}
  8. inline int sub(int x, int y) {return (x - y < 0 ? x - y + MOD : x - y);}
  9. inline int mul(int x, int y) {return 1LL * x * y % MOD;}
  10. int pow_mod(int b, int p) {
  11. int ret = 1;
  12. for(int i=p;i;i>>=1,b=mul(b,b))
  13. if( i & 1 ) ret = mul(ret, b);
  14. return ret;
  15. }
  16. bool nprm[MAXN + 5];
  17. int prm[MAXN + 5], phi[MAXN + 5], pcnt;
  18. void sieve() {
  19. phi[1] = 1;
  20. for(int i=2;i<=MAXN;i++) {
  21. if( !nprm[i] ) prm[++pcnt] = i, phi[i] = i - 1;
  22. for(int j=1;i*prm[j]<=MAXN;j++) {
  23. nprm[i*prm[j]] = true;
  24. if( i % prm[j] == 0 ) {
  25. phi[i*prm[j]] = phi[i]*prm[j];
  26. break;
  27. }
  28. else phi[i*prm[j]] = phi[i]*phi[prm[j]];
  29. }
  30. }
  31. }
  32. int c[105][105], f[105][105];
  33. void get_coef() {
  34. for(int i=0;i<=102;i++) {
  35. c[i][0] = 1;
  36. for(int j=1;j<=i;j++)
  37. c[i][j] = add(c[i-1][j], c[i-1][j-1]);
  38. }
  39. for(int i=0;i<=101;i++) {
  40. for(int j=0;j<=i+1;j++)
  41. f[i][j] = c[i+1][j];
  42. for(int j=0;j<i;j++) {
  43. for(int k=0;k<=j+1;k++)
  44. f[i][k] = sub(f[i][k], mul(c[i+1][j], f[j][k]));
  45. }
  46. int iv = pow_mod(i + 1, MOD - 2);
  47. for(int j=0;j<=i+1;j++)
  48. f[i][j] = mul(f[i][j], iv);
  49. }
  50. }
  51. int get_sum(int n, int k) {
  52. int ret = 0;
  53. for(int i=k+1;i>=0;i--)
  54. ret = add(mul(ret, n), f[k][i]);
  55. return ret;
  56. }
  57. int sum[MAXN + 5];
  58. void init() {
  59. sieve(), get_coef();
  60. for(int i=1;i<=MAXN;i++)
  61. sum[i] = add(sum[i-1], mul(mul(i, i), phi[i]));
  62. }
  63. ll n; int k;
  64. int id1[MAXN + 5], id2[MAXN + 5], cnt;
  65. int id(ll m) {return (m <= MAXN ? id1[m] : id2[n/m]);}
  66. ll a[MAXN + 5]; int s[MAXN + 5];
  67. void get_id() {
  68. cnt = 0;
  69. for(ll i=1;i<=n;i=(n/(n/i))+1) {
  70. ll p = n / i;
  71. if( p <= MAXN ) id1[p] = (++cnt);
  72. else id2[n/p] = (++cnt);
  73. a[cnt] = p, s[cnt] = -1;
  74. }
  75. }
  76. int phisum(ll m) {
  77. if( m <= MAXN ) return sum[m];
  78. int &ans = s[id(m)];
  79. if( ans != -1 ) return ans;
  80. ans = get_sum(m % MOD, 3);
  81. for(ll i=2;i<=m;i++) {
  82. ll p = m / i, j = m / p;
  83. ans = sub(ans, mul(sub(get_sum(j % MOD, 2), get_sum((i-1) % MOD, 2)), phisum(p)));
  84. i = j;
  85. }
  86. return ans;
  87. }
  88. int dp[MAXN + 5];
  89. void get_dp() {
  90. for(int i=1;i<=cnt;i++) dp[i] = sub(get_sum(a[i] % MOD, k + 1), 1);
  91. int tmp = 0;
  92. for(int i=1;i<=pcnt;i++) {
  93. ll sq = 1LL*prm[i]*prm[i]; int del = pow_mod(prm[i], k + 1);
  94. if( sq > n ) break;
  95. for(int j=1;j<=cnt;j++) {
  96. if( sq > a[j] ) break;
  97. dp[j] = sub(dp[j], mul(del, sub(dp[id(a[j] / prm[i])], tmp)));
  98. }
  99. tmp = add(tmp, del);
  100. }
  101. }
  102. void solve() {
  103. scanf("%lld%d", &n, &k), get_id(), get_dp();
  104. int ans = 0;
  105. for(ll i=1;i<=n;i++) {
  106. ll p = n / i, j = n / p;
  107. ans = add(ans, mul(sub(phisum(j), phisum(i - 1)), dp[id(p)]));
  108. i = j;
  109. }
  110. printf("%d\n", ans);
  111. }
  112. int main() {
  113. init();
  114. int T; scanf("%d", &T);
  115. while( T-- ) solve();
  116. }

@details@

整除分块时所有数都必须取 long long,但是取模要转成 int。注意一下不要出锅。

@hdu - 6607@ Easy Math Problem的更多相关文章

  1. [HDU - 5170GTY's math problem 数的精度类

    题目链接:HDU - 5170GTY's math problem 题目描述 Description GTY is a GodBull who will get an Au in NOI . To h ...

  2. HDU 5572--An Easy Physics Problem(射线和圆的交点)

    An Easy Physics Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/ ...

  3. 【HDU 5105】Math Problem

    题意 f(x)=|ax3+bx2+cx+d| 求f(x)在L≤x≤R的最大值. 分析 参数有可能是0,注意分类讨论 1.当a=0时 b=0,f为一次函数(c≠0)或者常数函数(c=0),最大值点在区间 ...

  4. ACM 2015年上海区域赛A题 HDU 5572An Easy Physics Problem

    题意: 光滑平面,一个刚性小球,一个固定的刚性圆柱体 ,给定圆柱体圆心坐标,半径 ,小球起点坐标,起始运动方向(向量) ,终点坐标 ,问能否到达终点,小球运动中如果碰到圆柱体会反射. 学到了向量模板, ...

  5. HDU 6182 A Math Problem

    暴力. $k$的$k$次方在$k=15$的时候,达到了最大不爆掉的情况. #include<bits/stdc++.h> using namespace std; long long an ...

  6. HDU 5055 Bob and math problem(结构体)

    主题链接:http://acm.hdu.edu.cn/showproblem.php?pid=5055 Problem Description Recently, Bob has been think ...

  7. HDU 5572 An Easy Physics Problem (计算几何+对称点模板)

    HDU 5572 An Easy Physics Problem (计算几何) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5572 Descripti ...

  8. HDU 1757 A Simple Math Problem 【矩阵经典7 构造矩阵递推式】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=1757 A Simple Math Problem Time Limit: 3000/1000 MS (J ...

  9. hdu 5105 Math Problem(数学)

    pid=5105" target="_blank" style="">题目链接:hdu 5105 Math Problem 题目大意:给定a.b ...

随机推荐

  1. 基于Javaee的影视创作论坛的设计与实现

    基于Javaee的影视创作论坛的设计与实现主要用功能包括: 首页推荐.用户管理.影片管理.评论管理. 预告片管理.海报管理.公告管理.数据检索.用户注册与登录等等功能.统结构如下 (1)后台管理: 管 ...

  2. CF832C

    题目链接:http://codeforces.com/contest/832/problem/C 题目大意: n个人,面向左或者右站在同一条轴上,每个人在轴上的坐标为x,速度为v.请你在某个位置放置一 ...

  3. tp入门

    其中可以配置隐藏看入口文件 和默认读取路径 <?php namespace app\admin\controller; //生命控制器 class Index { public function ...

  4. React-Native 爬坑爬坑

    出现函数找不到问题一般都是this的指向问题,一般是用箭头函数解决,解决不了就传入this 在setState里面一定不能要直接写state引入的值,如: this.setState({now: th ...

  5. PIC单片机的定时器

    PIC单片机的定时器有3个 timer0 timer1 timer2 定时器的计算方法 256*k*Tcy=定时时间 (256-Init-value)*k*Tcy=定时时间

  6. Java集合(十)实现Map接口的HashMap

    Java集合(十)继承Map接口的HashMap 一.HashMap简介(基于JDK1.8) HashMap是基于哈希表(散列表),实现Map接口的双列集合,数据结构是“链表散列”,也就是数组+链表 ...

  7. Unity 离线建造系统

    很多游戏,特别是养成类手游,都会有自己独特的建造系统,一个建造装置的状态循环或者说生命周期一般是这样的: 1.准备建造,设置各项资源的投入等 2.等待一段倒计时,正在建造中 3.建造结束,选择是否收取 ...

  8. cordova开发插件,并在android studio中开发、调试

    之前用过cordova Lib包装H5页面,自己写插件,但做法是野路子,不符合cordova插件的开发思路,这次项目又需要包装H5页面,同时需要自定义插件.所以又折腾了一次cordova自定义插件. ...

  9. Java的四种权限修饰符

    private:仅对本类可见 缺省(不需修饰符):对本包可见 protected:对本包及所有子类可见 public:对所有类可见 修饰符: * 权限修饰符:private,默认的,protected ...

  10. [统计信息系列7] Oracle 11g的自动统计信息收集

    (一)统计信息收集概述 在Oracle 11g中,默认有3个自动任务,分别是:自动统计信息收集.SQL调优顾问.段空间调整顾问,查看方法如下: SQL> SELECT CLIENT_NAME,T ...