首页 > 其他分享 >SPOJ GCDMAT - GCD OF MATRIX

SPOJ GCDMAT - GCD OF MATRIX

时间:2022-12-03 18:23:17浏览次数:51  
标签:GCD GCDMAT int sum mid varphi SPOJ mod gcd

简要题意

给出三个整数 \(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;
}

标签:GCD,GCDMAT,int,sum,mid,varphi,SPOJ,mod,gcd
From: https://www.cnblogs.com/zheyuanxie/p/spoj-gcdmat.html

相关文章

  • SPOJ PGCD - Primes in GCD Table
    简要题意\(T\)组数据,每组数据给出两个整数\(N,M\),求:\[\sum_{i=1}^{N}\sum_{j=1}^{M}{[\gcd(i,j)\in\mathbb{P}]}\]\(1\leqN,M\leq10^7,T\leq10\)思路双倍经验P225......
  • HDU 6273 Master of GCD(差分)
    题目分析贴一个别人的题解这个题就是一个差分数组,因为这数列的最大公约数就是这个数列2的出现2的最少次数的幂乘以3的出现3的最少次数的幂将2和3分开讨论,然后分......
  • 题解——GCD
    给定正整数\(n\),求\(1\lex,y\len\)且\(\gcd(x,y)\)为素数的数对\((x,y)\)有多少对。\(n\le10^7\)题解做法1题意即为求\(S=\sum_{质数p|n}\sum_{i=1}^n\sum_{......
  • Math: GCD greatest common divisor 最大公约数
     Loop:#include<stdio.h>intmain(void){printf("Hello,World!\n");intm,n,r;scanf("%d%d",&m,&n);if(m<n){m=m^n;......
  • SPOJLCMSUM - LCM Sum
    简要题意\(T\)组数据,每组数据给出一个\(n\),计算:\[\sum_{i=1}^{n}{\operatorname{lcm}(i,n)}\]\(1\leqT\leq3\times10^5,1\leqn\leq10^{6}\)思路比较快乐的......
  • 2022 ICPC 济南站 E - Identical Parity // exgcd
    题目来源:2022InternationalCollegiateProgrammingContest,JinanSiteE题目链接:https://codeforces.com/gym/104076/problem/E题意有\(T\)组案例,对于每个案例:......
  • gcd
    ♠useC++11最大公约数若\(a,b\in\mathbbN\)且\(k\mida,b\in\mathbbN\),且不存在更大的\(k\),称\(k\)是\(a,b\)的最大公约数。快速求\(a,b\in\math......
  • 2021 陕西省赛 C - GCD // 整除分块
    题目来源:2021年ICPC国际大学生程序设计竞赛暨陕西省第九届大学生程序设计竞赛题目链接:https://ac.nowcoder.com/acm/contest/35232/C题意给定三个整数\(l\)、\(r\)、\(......
  • 题解 I. gcd -“山大地纬杯”第十二届山东省ICPC大学生程序设计竞赛(正式赛)
    传送门VP的时候失误推错太多次了,写个博客总结一下【大意】求所有长度为\(m\)且和为\(n\)的正整数序列\(a\)的贡献和。其中,每个数列的贡献为\(\displaystyle\s......
  • GCD算法
    以下是记录的一些笔记:有些混乱,寒假再来细细整理。   python实现:defgcd(a,b):while(b!=0):r=a%ba,b=b,rreturnaprint(gc......