http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1190

\[\begin{aligned}
&\sum_{i=a}^b\frac{ib}{(i,b)}\\
=&b\sum_{i=a}^b\frac i{(i,b)}\\
=&b\sum_{d|b}\sum_{i=a}^b[d|i]\left[\left(\frac id,\frac bd\right)=1\right]\frac id\\
=&b\sum_{d|b}\sum_{i=\left\lceil\frac ad\right\rceil}^{\frac bd}\left[\left(i,\frac bd\right)=1\right]i\\
=&b\sum_{d|b}\sum_{i=\left\lceil\frac ad\right\rceil}^{\frac bd}i\sum_{d'|i,d'|\frac bd}\mu(d')\\
=&b\sum_{d|b}\sum_{d'|\frac bd}\mu(d')\sum_{i=\left\lceil\frac {a}{dd'}\right\rceil}^{\frac{b}{dd'}}id'\\
=&b\sum_{T|b}\sum_{d|T}\mu(d)\sum_{i=\left\lceil\frac aT\right\rceil}^{\frac bT}id\\
=&b\sum_{T|b}\frac{\left(\left\lceil\frac aT\right\rceil+\frac bT\right)\left(\frac bT-\left\lceil\frac aT\right\rceil+1\right)}{2}\sum_{d|T}\mu(d)d
\end{aligned}
\]

\(\sum\limits_{d|T}\mu(d)d=\prod\left(1-p_i\right)\),只要确定T的质因子就可以确定\(\sum\limits_{d|T}\mu(d)d\)的值。

如果循环枚举T找b的约数,无法快速计算T的质因子。

可以dfs枚举b的约数T,动态计算\(\sum\limits_{d|T}\mu(d)d\)的值。

时间复杂度\(O\left(T\sqrt n\right)\)。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll; const int N = 100000;
const int p = 1000000007;
const int ni2 = 500000004; bool notp[N];
int a, b, tot, P[N], c[N], num = 0, prime[N]; void Euler_shai() {
for (int i = 2; i <= N; ++i) {
if (!notp[i]) prime[++num] = i;
for (int j = 1; j <= num && prime[j] * i <= N; ++j) {
notp[prime[j] * i] = true;
if (i % prime[j] == 0) break;
}
}
} void pre(int x) {
tot = 0;
for (int i = 1, pi = 2; i <= num && pi * pi <= x; pi = prime[++i])
if (x % pi == 0) {
P[++tot] = pi; c[tot] = 0;
while (x % pi == 0) x /= pi, ++c[tot];
}
if (x > 1)
P[++tot] = x, c[tot] = 1;
} int ans; void dfs(int tmp, int T, int f) {
if (tmp > tot) {
int l = a / T, r = b / T;
if (a % T) ++l;
(ans += 1ll * (l + r) * (r - l + 1) % p * ni2 % p * f % p) %= p;
return;
}
dfs(tmp + 1, T, f);
int tt = T, ff = 1ll * f * (1 - P[tmp] + p) % p;
for (int i = 1; i <= c[tmp]; ++i) {
tt *= P[tmp];
dfs(tmp + 1, tt, ff);
}
} int main() {
Euler_shai(); int T; scanf("%d", &T);
while (T--) {
scanf("%d%d", &a, &b);
pre(b);
ans = 0;
dfs(1, 1, 1);
printf("%lld\n", 1ll * b * ans % p);
} return 0;
}

最新文章

  1. [PHP源码阅读]strtolower和strtoupper函数
  2. 关于asp.net与jquery ajax 的一些补充
  3. Prince2的七大原则(6)
  4. Js_Ajax_用户名检测
  5. struts1+spring+myeclipse +cxf 开发webservice以及普通java应用调用webservice的实例
  6. ssh和mvc理论基础
  7. weblogic .NoClassDefFoundError: Could not initialize class sun.awt.X11Graphi
  8. HDU 4651 Partition(整数拆分)
  9. 【Objective-C】04-第一个OC程序解析
  10. NPOI心得
  11. [Tree]Count Complete Tree Nodes
  12. HDU 1856 More is better(并查集+离散化)
  13. 前端MVVM框架avalon - 模型转换1
  14. js所有函数集合
  15. Phpcms V9缩略图裁剪存在黑边的解决方法
  16. 自制 h5 音乐播放器 可搜索
  17. 为什么使用JDBC操作MySQL需要添加Class.forName(&quot;com.mysql.jdbc.Driver&quot;)
  18. 有关Linux ipv6模块加载失败的问题
  19. IntelliJ IDEA 中SpringBoot对Run/Debug Configurations配置 SpringBoot热部署
  20. flask-security(一)快速入门

热门文章

  1. GridControl详解(六)样式设置
  2. jQuery.fill 数据填充插件
  3. [php]require&amp;require_once&amp;include&amp;include_once的用法与区别
  4. jquery.cookie.js——jquery的cookie插件
  5. 残差网络(Residual Network)
  6. python简单爬虫一
  7. ltib安装过程中遇到好多问题,从网上转来的好多份总结
  8. 「caffe编译bug」.build_release/lib/libcaffe.so: undefined reference to cv::imread
  9. javaScript-继承2种方式
  10. laravel入门教程