HDU 2841:Visible Trees ← 容斥原理

2024-01-07 05:52

本文主要是介绍HDU 2841:Visible Trees ← 容斥原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【题目来源】
http://acm.hdu.edu.cn/showproblem.php?pid=2841

【题目描述】
There are many trees forming a m * n grid, the grid starts
from (1,1). Farmer Sherlock is standing at (0,0) point. He wonders how many trees he can see.
If two trees and Sherlock are in one line, Farmer Sherlock can only see the tree nearest to him.

【输入格式】
The first line contains one integer t, represents the number of test cases. Then there are multiple test cases. For each test case there is one line containing two integers m and n(1 ≤ m, n ≤ 100000)

【输出格式】
For each test case output one line represents the number of trees Farmer Sherlock can see.

【输入样例】
2
1 1
2 3

【输出样例】
1
5

【算法分析】
在计数时,必须注意无一重复,无一遗漏。为了使重叠部分不被重复计算,人们研究出一种计数方法,这种方法的基本思想是:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复,这种计数的方法称为
容斥原理

针对本题,显然,若 (x,y) 能被看到,那么 (k*x, k*y) 都不能被看到(其中,k>1)。
因此,问题转化为求 1<=x<=n 且 1<=y<=m 有多个 <x,y> 满足 gcd(x,y)=1。
那么可以从 1~n 枚举 x,累计 1~m 中与 x 互质的个数。
对 x 分解素因子,容斥一下就可得到结果。

【算法代码】

#include <iostream>
#include <vector>
using namespace std;typedef long long LL;
vector<int> v;
int n,m;void pfac(int x) { //Find all the prime factors of xv.clear();for(int i=2; i*i<=x; i++) {if(x%i==0) {v.push_back(i);while(x%i==0) x/=i;}}if(x>1) v.push_back(x);
}int solve(int x) {int sum=0;for(int i=1; i<(1<<v.size()); i++) {int res=1,cnt=0;for(int j=0; j<v.size(); j++) {if(i & (1<<j)) {res*=v[j];cnt++;}}if(cnt & 1) sum+=x/res;else sum-=x/res;}return sum;
}int main() {int T;cin>>T;while(T--) {scanf("%d %d",&n,&m); //cin>>n>>m;LL ans=m;for(int i=2; i<=n; i++) {pfac(i);ans+=m-solve(m);}printf("%lld\n",ans);}
}/*
in:
2
1 1
2 3out:
1
5
*/




【参考文献】
https://www.cnblogs.com/00isok/p/10358598.html
https://blog.csdn.net/weixin_53746961/article/details/121175561
https://blog.csdn.net/weixin_43846139/article/details/105517437
https://www.cnblogs.com/crackpotisback/p/4846909.html
http://www.manongjc.com/detail/39-wpncookuuhcoyui.html
https://blog.csdn.net/weixin_30710457/article/details/98919034




 

这篇关于HDU 2841:Visible Trees ← 容斥原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/578917

相关文章

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

MyBatis-Plus 与 Spring Boot 集成原理实战示例

《MyBatis-Plus与SpringBoot集成原理实战示例》MyBatis-Plus通过自动配置与核心组件集成SpringBoot实现零配置,提供分页、逻辑删除等插件化功能,增强MyBa... 目录 一、MyBATis-Plus 简介 二、集成方式(Spring Boot)1. 引入依赖 三、核心机制

redis和redission分布式锁原理及区别说明

《redis和redission分布式锁原理及区别说明》文章对比了synchronized、乐观锁、Redis分布式锁及Redission锁的原理与区别,指出在集群环境下synchronized失效,... 目录Redis和redission分布式锁原理及区别1、有的同伴想到了synchronized关键字

Linux中的HTTPS协议原理分析

《Linux中的HTTPS协议原理分析》文章解释了HTTPS的必要性:HTTP明文传输易被篡改和劫持,HTTPS通过非对称加密协商对称密钥、CA证书认证和混合加密机制,有效防范中间人攻击,保障通信安全... 目录一、什么是加密和解密?二、为什么需要加密?三、常见的加密方式3.1 对称加密3.2非对称加密四、

setsid 命令工作原理和使用案例介绍

《setsid命令工作原理和使用案例介绍》setsid命令在Linux中创建独立会话,使进程脱离终端运行,适用于守护进程和后台任务,通过重定向输出和确保权限,可有效管理长时间运行的进程,本文给大家介... 目录setsid 命令介绍和使用案例基本介绍基本语法主要特点命令参数使用案例1. 在后台运行命令2.

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、