SPOJ GCDMAT - GCD OF MATRIX
简要题意
给出三个整数 \(T,n,m\),\(T\) 组询问,每组询问给出四个整数 \(i_1,j_1,i_2,j_2\)(数据保证 \(i_1,j_1\leq n\ \ i_2,j_2\leq m\)),计算:
\]
\(1\leq T\leq500,1\leq n,m\leq5\times10^4\)
思路
这是一道欧拉反演题。
首先我们可以转换为求下面的式子:
\]
为什么,因为可以通过差分的思想将题目中的式子改为 \(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)\)。
然后代入原式(以下过程省略模数):
\]
改为先枚举 \(p\),得:
\]
将右边的式子化简得:
\]
预处理 \(\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的更多相关文章
- 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 ...
- 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); 现 ...
- SPOJ.104.Highways([模板]Matrix Tree定理 生成树计数)
题目链接 \(Description\) 一个国家有1~n座城市,其中一些城市之间可以修建高速公路(无自环和重边). 求有多少种方案,选择修建一些高速公路,组成一个交通网络,使得任意两座城市之间恰好只 ...
- SPOJ:NO GCD (求集合&秒啊)
You are given N(1<=N<=100000) integers. Each integer is square free(meaning it has no divisor ...
- 题解 SP26045 【GCDMAT2 - GCD OF MATRIX (hard)】
承接一下洛咕上的题解,这里基本就是谈谈优化,放个代码的 我们发现这里的常数主要来自于除法,那么我们优化除法次数,把所有的 \(n/1...n/s\) (\(s=\sqrt n\))存下来,然后归并排( ...
- X000010
P1829 [国家集训队]Crash的数字表格 / JZPTAB 题意:求 \({\rm S}(n,m)=\sum\limits_{i=1}^n\sum\limits_{j=1}^m{\rm lcm} ...
- (转载)关于gcd的8题
发现其实有关gcd的题目还是挺多的,这里根据做题顺序写出8题. [bzoj2818: Gcd] gcd(x,y)=质数, 1<=x,y<=n的对数 做这题的时候,懂得了一个非常重要的转化: ...
- 希尔密码(Hill Cipher)的实现
原理应该不用多讲了,自己百度就可以. C++实现: #include <iostream> #include <string> #include <memory.h> ...
- spoj 7001. Visible Lattice Points GCD问题 莫比乌斯反演
SPOJ Problem Set (classical) 7001. Visible Lattice Points Problem code: VLATTICE Consider a N*N*N la ...
- 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 ...
随机推荐
- 在vue项目中禁用eslint
文章目录 1.在创建项目的时候不自动使用eslint 2.在package.json中删除所有的eslint,然后重新install 3.按照图片注释(亲测可用) 在使用eslin进行规则验证时,一点 ...
- 如何使用ffmpeg缩小视频的大小?
如何使用ffmpeg缩小视频的大小? 看到这个答案.为方便起见,在下面引用: 通过将1 GB除以以秒为单位的视频长度来计算所需的比特率.因此,对于长度为16:40(1000秒)的视频,请使用10000 ...
- 【lwip】08-ARP协议一图笔记及源码实现
目录 前言 8.1 IP地址与MAC地址 8.2 ARP协议简介 8.3 ARP协议报文 8.4 ARP缓存表 8.4.1 ARP缓存表简介 8.4.2 LWIP中的缓存表 8.4.3 ARP缓存表数 ...
- 2022春每日一题:Day 16
题目:不同子串个数 这题需要利用后缀数组求出的height的性质,我们发现对于每个后缀,他的height后的所有子串就是算在答案里,因此答案只需要求出n-height[i]-sa[i]+1的和就可以了 ...
- golang面向对象
一.方法 1.方法是作用在指定的数据类型上,和指定的数据类型绑定,因此自定义类型都可以有方法,而不仅仅是struct: 2.方法的申明和格式调用: package main import ( &quo ...
- [排序算法] 直接/折半插入排序 (C++)
插入排序解释 插入排序很好理解,其步骤是 :先将第一个数据元素看作是一个有序序列,后面的 n-1 个数据元素看作是未排序序列.对后面未排序序列中的第一个数据元素在这个有序序列中进行从后往前扫描,找到合 ...
- 在Linux配置git
生成ssh ssh-keygen -t rsa 可以不设置密码,一路回车就行,会在 ~/.ssh/下生成两个ssh key: ssh-add ~/.ssh/id_rsa.pub 这一步是使用刚才生成那 ...
- 关于python3调用matplotlib中文乱码问题
问题描述 我用来绘制柱形图,横坐标上面的数据, 但是网上大部分说的都是更改横纵坐标标签的乱码问题,而不是横坐标数据乱码问题 解决办法 更改横纵坐标上标签的中文不乱码 import matplotlib ...
- 根据经纬度算UTM带号
1. UTM (Universal Transverse Mercator)坐标系是由美国军方在1947提出的.虽然我们仍然将其看作与"高斯-克吕格"相似的坐标系统,但实际上UT ...
- Nginx 安装篇-1.19.9版本源码安装
系统环境:CentOS 8.5 64位 [开始安装](此步骤引自网络教程) https://www.cnblogs.com/torchstar/p/16027538.html 教程比较详细,一步步操作 ...