简要题意

给出三个整数 \(T,n,m\),\(T\) 组询问,每组询问给出四个整数 \(i_1,j_1,i_2,j_2\)(数据保证 \(i_1,j_1\leq n\ \ i_2,j_2\leq m\)),计算:

\[\sum_{i=i_1}^{i_2}\sum_{j=j_1}^{j_2}{\gcd(i,j)}\bmod{10^9+7}
\]

\(1\leq T\leq500,1\leq n,m\leq5\times10^4\)

思路

这是一道欧拉反演题。

首先我们可以转换为求下面的式子:

\[F(x,y)=\sum_{i=1}^{x}\sum_{j=1}^{y}{\gcd(i,j)}\bmod{10^9+7}
\]

为什么,因为可以通过差分的思想将题目中的式子改为 \(F(i_2,j_2)-F(i_1-1,j_2)-F(i_2,j_1-1)-F(i_1-1,j_1-1)\)。而且从 \(1\) 开始求和的式子更容易变形。

下面设 \(F(x,y)\) 中 \(x<y\)。

定理 1(欧拉反演公式):\(i=\sum_{d\mid i}{\varphi(d)}\)

证明:\(i=\sum_{d\mid i}\sum_{j=1}^{i}{[\gcd(i,j)=d]}=\sum_{d\mid i}\sum_{j=1}^{\lfloor\frac{i}{d}\rfloor}{[\gcd(i,j)=1]}=\sum_{d\mid i}\varphi(\frac{i}{d})=\sum_{d\mid i}{\varphi(d)}\)

推论 1:\(\gcd(i,j)=\sum_{p\mid i,p\mid j}\varphi(p)\)

证明:由欧拉反演公式 \(i=\sum_{d\mid i}{\varphi(d)}\) 得 \(\gcd(i,j)=\sum_{p\mid\gcd(i,j)}\varphi(p)\)。根据最大公约数的性质即可变形成 \(\gcd(i,j)=\sum_{p\mid i,p\mid j}\varphi(p)\)。

然后代入原式(以下过程省略模数):

\[F(x,y)=\sum_{i=1}^{x}\sum_{j=1}^{y}{\sum_{p\mid i,p\mid j}\varphi(p)}
\]

改为先枚举 \(p\),得:

\[F(x,y)=\sum_{p=1}^{x}\varphi(p)(\sum_{i=1}^{x}\sum_{j=1}^{y}{[p\mid i][p\mid j]})
\]

将右边的式子化简得:

\[F(x,y)=\sum_{p=1}^{x}\varphi(p)\lfloor\frac{n}{p}\rfloor\lfloor\frac{m}{p}\rfloor
\]

预处理 \(\varphi\) 函数前缀和,就可以使用数论分块计算了。

时间复杂度预处理 \(O(m)\),单次询问 \(O(\sqrt{n})\)。

代码

#include <bits/stdc++.h>
#define int long long
using namespace std; int phi[10000005],vis[10000005],prime[10000005],sum[10000005],tot;
const int mod = 1e9+7; int M(const int x){
return (x%mod+mod)%mod;
} void sieve(){
phi[1]=1;
for(int i=2;i<=50000;i++){
if(!vis[i]){
prime[++tot]=i;
phi[i]=i-1;
}
for(int j=1;j<=tot&&i*prime[j]<=50000;j++){
vis[i*prime[j]]=1;
if(!(i%prime[j])){
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
phi[i*prime[j]]=phi[i]*phi[prime[j]];
}
}
for(int i=1;i<=50000;i++){
sum[i]=M(sum[i-1]+phi[i]);
}
} int solve(int a,int b) {
int ans=0;
if (a>b) swap(a,b);
for (int l=1,r=0;l<=a;l=r+1) {
r=min(a/(a/l),b/(b/l));
ans=M(ans+M(M(M(sum[r]-sum[l-1])*(a/l))*(b/l)));
}
return ans;
} int n,m,T; signed main() {
sieve();
cin>>T>>n>>m;
while (T--) {
int i1,j1,i2,j2;
cin>>i1>>j1>>i2>>j2;
cout<<M(solve(i2,j2)-solve(i1-1,j2)-solve(i2,j1-1)+solve(i1-1,j1-1))<<'\n';
}
return 0;
}

SPOJ GCDMAT - GCD OF MATRIX的更多相关文章

  1. spoj 3871. GCD Extreme 欧拉+积性函数

    3871. GCD Extreme Problem code: GCDEX Given the value of N, you will have to find the value of G. Th ...

  2. spoj 3871 gcd extreme

    题目大意给出一个n,求sum(gcd(i,j),<i<j<=n); 可以明显的看出来s[n]=s[n-]+f[n]; f[n]=sum(gcd(i,n),<i<n); 现 ...

  3. SPOJ.104.Highways([模板]Matrix Tree定理 生成树计数)

    题目链接 \(Description\) 一个国家有1~n座城市,其中一些城市之间可以修建高速公路(无自环和重边). 求有多少种方案,选择修建一些高速公路,组成一个交通网络,使得任意两座城市之间恰好只 ...

  4. SPOJ:NO GCD (求集合&秒啊)

    You are given N(1<=N<=100000) integers. Each integer is square free(meaning it has no divisor ...

  5. 题解 SP26045 【GCDMAT2 - GCD OF MATRIX (hard)】

    承接一下洛咕上的题解,这里基本就是谈谈优化,放个代码的 我们发现这里的常数主要来自于除法,那么我们优化除法次数,把所有的 \(n/1...n/s\) (\(s=\sqrt n\))存下来,然后归并排( ...

  6. X000010

    P1829 [国家集训队]Crash的数字表格 / JZPTAB 题意:求 \({\rm S}(n,m)=\sum\limits_{i=1}^n\sum\limits_{j=1}^m{\rm lcm} ...

  7. (转载)关于gcd的8题

    发现其实有关gcd的题目还是挺多的,这里根据做题顺序写出8题. [bzoj2818: Gcd] gcd(x,y)=质数, 1<=x,y<=n的对数 做这题的时候,懂得了一个非常重要的转化: ...

  8. 希尔密码(Hill Cipher)的实现

    原理应该不用多讲了,自己百度就可以. C++实现: #include <iostream> #include <string> #include <memory.h> ...

  9. spoj 7001. Visible Lattice Points GCD问题 莫比乌斯反演

    SPOJ Problem Set (classical) 7001. Visible Lattice Points Problem code: VLATTICE Consider a N*N*N la ...

  10. SPOJ LGLOVE 7488 LCM GCD Love (区间更新,预处理出LCM(1,2,...,n))

    题目连接:http://www.spoj.com/problems/LGLOVE/ 题意:给出n个初始序列a[1],a[2],...,a[n],b[i]表示LCM(1,2,3,...,a[i]),即1 ...

随机推荐

  1. Linux文件属性与管理

    文件或目录属性主要包括: 索引节点,inode 文件类型 文件权限 硬链接个数 归属的用户和用户组 最新修改时间 查看命令 ls -lhi /opt 图解: Inode索引节点号,(人的身份证,家庭地 ...

  2. 优雅处理Golang中的异常

    我们在使用Golang时,不可避免会遇到异常情况的处理,与Java.Python等语言不同的是,Go中并没有try...catch...这样的语句块,我们知道在Java中使用try...catch.. ...

  3. FastApi学习1

    先写路由文件: 其次通过ORM操作数据库相关:

  4. java学习之spring基础

    0x00前言 spring框架应用的是ioc模式,ioc模式是指控制反转模式,本质是你不去创建对象让spring框架给你创建对象你去使用对象.多种开发模式通过配置文件和注解的方式去开发的都很值得去学习 ...

  5. 1.docker的基本使用

    1.简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化.容器是完 ...

  6. 【Zulip】邮件系统配置

    通过docker-compose(docker-zulip)部署Zulip实例时需要配置邮件系统 SETTING_ZULIP_ADMINISTRATOR: '...@qq.com' SETTING_E ...

  7. 【iOS逆向与安全】frida-trace入门

    前言 frida-trace是一个用于动态跟踪函数调用的工具.支持android和ios.安装教程请参考官网.工欲善其事必先利其器.本文将以某App为示范,演示frida-trace的各种方法在iOS ...

  8. i春秋exec

    打开是一个gif,提示文字未登录 话不多说,查看源码 发现vim字样,可能是文件泄露 直接在url后加/.index.php.swp来下载泄露文件 下载好了之后放vm上使用vim -r  .index ...

  9. nm命令解释

    nm命令参数解释 -A 或-o或 --print-file-name:打印出每个符号属于的文件-a或--debug-syms:打印出所有符号,包括debug符号-B:BSD码显示-C或--demang ...

  10. Execute Crond Service on openEuler

    一.Execute Crond Service on openEuler 1 crond 概述 crond就是计划任务/定时任务 常见有闹钟.PC端定时关机 shutdown -s -t 200,定时 ...