首页 > 其他分享 >洛谷P3455 笔记

洛谷P3455 笔记

时间:2024-02-07 22:34:12浏览次数:18  
标签:lfloor le 洛谷 int sum 笔记 rfloor P3455 frac

传送门

又是一道看了tj的题。

题意

\(t\) 次询问,每次询问给定 \(n\),\(m\),\(k\) ,求 \(\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j)=k]\)。

\(1\le t\le 5\times10^4\),\(1\le k\le n\) , \(m\le 5\times10^4\)

正文

把 \(k\) 扔到上界去,记原式变为 \(\sum_{i=1}^{\lfloor \frac{n}{k}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{k}\rfloor}[gcd(i,j)=1]\)

然后利用莫比乌斯函数性质,把等于 \(1\) 的判断去掉,得 \(\sum_{i=1}^{\lfloor \frac{n}{k}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{k}\rfloor}\sum_{d|gcd(i,j)}\mu(d)\)

接着把 \(d\) 扔到前面去,把整除的条件去掉,记 \(r=min(\lfloor\frac{n}{k}\rfloor\lfloor\frac{m}{k}\rfloor)\) ,得 \(\sum_{d=1}^{r}\sum_{i=1}^{\lfloor \frac{n}{kd}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{kd}\rfloor}\mu(d)\)

最后一步很显然,\(\mu(d)\) 放到前面,得到最后的柿子: \(\sum_{d=1}^{r}\mu(d)\lfloor \frac{n}{kd}\rfloor\lfloor\frac{m}{kd}\rfloor\)

这个时候思路很显然了。线性筛筛出 \(1\) 到 \(5 \times 10^4\) 内的所有 \(\mu(i)\) 并做一个前缀和,然后就可以整除分块了。

code

//writer:Oier_szc

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5,INF=2e9,mod=1e9+7;
int t,n,a,b,d;
int f[N],qzh[N];
int primes[N],st[N],len=0;
void xxs()
{
	f[1]=1;
	for(int i=2;i<=5e4;++i)
	{
		if(!st[i]) primes[++len]=i,f[i]=-1;
		for(int j=1;j<=len&&primes[j]<=5e4/i;++j)
		{
			st[i*primes[j]]=true;
			if(i%primes[j]==0) 
			{
				f[i*primes[j]]=0;
				break;
			}
			else f[i*primes[j]]=-f[i];
		}
	}
	for(int i=1;i<=5e4;++i) qzh[i]=qzh[i-1]+f[i];
}
signed main()
{
	xxs();
	scanf("%lld",&t);
	while(t--)
	{
		scanf("%lld%lld%lld",&a,&b,&d);
		a/=d,b/=d;
		n=min(a,b);
		int ans=0;
		for(int l=1,r;l<=n;l=r+1)
		{
			r=min(a/(a/l),b/(b/l));
			ans+=(qzh[r]-qzh[l-1])*(a/l)*(b/l);
		}
		printf("%lld\n",ans);
	}
	return 0;
}

总结一下,可以发现这道题推柿子的技巧在于将难以处理的判断条件用一些转换去掉,得到最终柿子后又用到了线性筛和整除分块的技巧以降低复杂度。

标签:lfloor,le,洛谷,int,sum,笔记,rfloor,P3455,frac
From: https://www.cnblogs.com/StevenZC/p/18011419

相关文章

  • 2024/2/7学习进度笔记
    为什么要用非线性函数要解释这个问题,可以反过来思考一下,为什么激活函数不能使用线性函数。如果使用线性函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合。加深神经网络的层数就没有什么意义了。线性函数的问题在于不管加深层数到多少,总是存在......
  • Go语言精进之路读书笔记第19条——理解Go语言表达式的求值顺序
    第19条了解Go语言控制语句惯用法及使用注意事项19.1使用if控制语句时应遵循"快乐路径"原则当出现错误时,快速返回;成功逻辑不要嵌入if-else语句中;"快乐路径"当执行逻辑中代码布局上始终靠左,这样读者可以一眼看到该函数当正常逻辑流程;"快乐路径"的返回值一般在函数最后一行。......
  • Go语言精进之路读书笔记第17条——理解Go语言表达式的求值顺序
    Go语言表达式支持在同一行声明和初始化多个变量支持在同一行对多个变量进行赋值(不同类型也可以)vara,b,c=5,"hello",3.45a,b,c:=5,"hello",3.45a,b,c=5,"hello",3.45RobPike练习题(规则见17.3赋值语句的求值)n0,n1=n0+n1,n0或者n0,n1=op(......
  • 领域驱动设计(Domain-Driven Design,简称DDD)【简介 个人学习笔记】
    找到了第1篇资料:领域驱动设计详解:是什么、为什么、怎么做?-知乎找到了第2篇资料:领域驱动架构(DDD)建模中的模型到底是什么?-知乎找到了第3篇资料:一文看懂DDD领域驱动设计-知乎找到了第4篇资料:什么是DDD(领域驱动设计)?这是我见过最容易理解的...找到了第5篇资料:领......
  • Go语言精进之路读书笔记第18条——理解Go语言代码块与作用域
    18.1Go代码块与作用域简介Go规范定义了如下几种隐式代码块。宇宙代(Universe)码块:所有Go源码都在该隐式代码块中,就相当于所有Go代码等最外层都存在一对大括号。包代码块:每个包都有一个包代码块,其中放置着该包都所有Go源码文件夹代码块:每个文件都有一个文件代码块,其中包含着该......
  • Go语言精进之路读书笔记第15条——了解string实现原理并高效使用
    15.1Go语言的字符串类型在Go语言中,无论是字符串常量、字符串变量还是代码中出现的字符串字面量,它们的类型都被统一设置为string特点string类型的数据是不可变的对string进行切片化后,Go编译器会为切片变量重新分配底层存储而不是共用string的底层存储string的底层的数据存......
  • Go语言精进之路读书笔记第16条——理解Go语言的包导入
    Go编译速度快的原因主要体现在以下三方面:Go要求每个源文件在开头处显式地列出所有依赖的包导入,这样Go编译器不必读取和处理整个文件就可以确定其依赖的包列表。Go要求包之间不能存在循环依赖。这样一个包的依赖关系便形成了一张有向无环图。由于无环,包可以被单独编译,也可以并行......
  • Django知识笔记1
    本文从分析现在流行的前后端分离Web应用模式说起,然后介绍如何设计RESTAPI,通过使用Django来实现一个RESTAPI为例,明确后端开发RESTAPI要做的最核心工作,然后介绍DjangoRESTframework能帮助我们简化开发RESTAPI的工作。Web应用模式在开发Web应用中,有两种应用模式:前后端不分离......
  • Go语言精进之路读书笔记第14条——了解map实现原理并高效使用
    14.1什么是mapmap对value的类型没有限制,但是对key的类型有严格要求:key的类型应该严格定义了作为“==”和“!=”两个操作符的操作数时的行为,因此func、map、slice、chan不能作为map的key类型。map类型不支持“零值可用”,未显式赋初值的map类型变量的零值为nil。对处于零值状态的......
  • 软件测试学习笔记丨UI_ai自动化获取图片验证码
    UI自动化获取图片验证码代码test_ai.pyfromtimeimportsleepfromseleniumimportwebdriverfromselenium.webdriver.common.byimportByfromL5.AICode.ocr_codeimportOCRCodeclassTestAi:defsetup_class(self):self.driver=webdriver.Chrome()......