第一次接触莫比乌斯反演,总之脑子都快要炸掉了……好难啊!本蒟蒻表示根本无法理解呜呜呜呜呜……不过在机房DL的帮助下总算是磕磕绊绊的A掉了这一题:

  这道题目要我们的求的是:(1)ΣiΣj [gcd(i,j)==k], 区间范围内的限定我们都可以利用容斥来解决,所以默认为所求函数值的(i, j)取值范围为(1~n,1~m)。注意到gcd(i, j) == k比较的不好求解,我们把k除到外面去,得到:(2)ΣiΣj [gcd(i,j)==1](i∈n/k, j∈m/k); 这里将[gcd(i,j)==1]替换为单位元ε(ε(i) = i == 1 ? 1 : 0)。根据狄利克雷卷积有μ * 1 = ε(*为卷积符号),所以我们得到式子(3)ΣiΣjΣd|gcd(i,j)μ(d)。这里是考虑对于每一对i,j有哪几个d与之对应,我们将d提取出来,反之枚举符合d|gcd(i,j)的数对。由此有(4)Σd μ(d) * (n / (d*k)) * (m / (d * k))(d∈min(n, m) / (d * k))。

  但是利用最后这个式子求解的复杂度依然太高了,不过因为n/i的取值最多只有2*sqrt(n)种(若i<sqrt(n),i的取值只有sqrt(n)种,若i>=sqrt(n),n/i<=sqrt(n),所以一共最多只有2*sqrt(n)种),所以在很大的范围内实际上(n / (d*k)) * (m / (d * k))都是一个常数,我们就可以利用μ(d)的前缀和来实现快速求解。

  设当前枚举到的d,pos = min(n / (n / d), m / (m / d)); 这个pos就是从当前位置一直到达pos,(n / (d*k)) * (m / (d * k))都是一个常数,只需要计算一次之后利用前缀和求解。

  贴代码,再一次被自己蠢哭,智商堪忧怎么办啊QAQ(向数学组DL低头,伏地%%%,跪地%%%!!!)

#include <bits/stdc++.h>
using namespace std;
#define maxn 65000
int tot, T, maxx = , sum[maxn], pri[maxn], Mu[maxn];
bool is_prime[maxn]; int read()
{
int x = , k = ;
char c;
c = getchar();
while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * k;
} int Get_Mu()
{
Mu[] = ;
for(int i = ; i <= maxx; i ++)
{
if(!is_prime[i]) pri[++ tot] = i, Mu[i] = -;
for(int j = ; j <= tot; j ++)
{
if(i * pri[j] > maxx) break;
is_prime[i * pri[j]] = true;
if(!(i % pri[j]))
{
Mu[i * pri[j]] = ;
break;
}
else Mu[i * pri[j]] = - Mu[i];
}
}
for(int i = ; i <= maxx; i ++)
sum[i] = sum[i - ] + Mu[i];
} int cal(int n, int m)
{
if(n > m) swap(n, m);
int ans = , pos;
for(int i = ; i <= n; i = pos + )
{
pos = min(n / (n / i), m / (m / i));
ans += (sum[pos] - sum[i - ]) * (n / i) * (m / i);
}
return ans;
} int main()
{
Get_Mu();
T = read();
while(T --)
{
int a = read(), b = read(), c = read(), d = read(), k = read();
a --, c --;
a /= k, b /= k, c /= k, d /= k;
int ans = cal(a, c) + cal(b, d) - cal(a, d) - cal(b, c);
printf("%d\n", ans);
}
return ;
}

最新文章

  1. node的事件模块应用(译)
  2. Google类VR设备知识
  3. Matlab绘图详解
  4. php基础-转义字符
  5. 2016北京PHP39期 ThinkPHP Discuz Dedecms 微信开发视频教程
  6. js - ajax中的get和post说明
  7. ASP + ACCESS保存图片文件之实现
  8. 一步步学习ASP.NET MVC3 (11)——@Ajax,JavaScriptResult(2)
  9. Spring 中各种通知
  10. Hibernate的generator属性
  11. Java 基础类型转换byte数组, byte数组转换基础类型
  12. ftp服务搭建
  13. A Simple Math Problem(矩阵快速幂)(寒假闭关第一题,有点曲折啊)
  14. 数据分析与展示——Matplotlib库入门
  15. python获取操作系统平台、版本及架构
  16. node.js 模块的分类
  17. asp.net core MVC 控制器,接收参数,数据绑定
  18. 移动端iscroll实现日期选择
  19. Initialize a vector in C++ (5 different ways)
  20. windows程序设计 基础

热门文章

  1. 针对 npm ERR! cb() never called! 问题
  2. 初次了解MVC框架模式
  3. 上传文件到阿里云linux服务器
  4. WinForm webbrowser控件的使用
  5. JS 红包随机
  6. keil5 mdk调用外部编辑器notepad++、sublime3、VSCode总结
  7. python爬虫 爬取steam热销游戏
  8. C语言:类型、运算符、表达式
  9. C语言数据结构(二)
  10. LeetCode:22. Generate Parentheses(Medium)