博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 2841 Visible Trees(莫比乌斯反演)
阅读量:7092 次
发布时间:2019-06-28

本文共 1411 字,大约阅读时间需要 4 分钟。

题目连接:

题意:给n*m的矩阵(从(1,1)开始编号)格子,每个格子有一棵树,人站在(0,0)的位置,求可以看到多少棵树。同一直线上的树只能看到最靠近人的那颗。

思路:可以将题目转化为求gcd(x, y) = 1,(1 <= x <= n, 1 <= y <= m)的对数。直接套用莫比乌斯反演即可。

code:

1 #include 
2 #include
3 #include
4 using namespace std; 5 typedef long long LL; 6 const int MAXN = 1000005; 7 8 bool check[MAXN]; 9 int primes[MAXN];10 int mu[MAXN];11 12 void moblus()13 {14 memset(check, false, sizeof(check));15 mu[1] = 1;16 int cnt = 0;17 18 for (int i = 2; i < MAXN; ++i) {19 if (!check[i]) {20 primes[cnt++] = i;21 mu[i] = -1;22 }23 for (int j = 0; j < cnt; ++j) {24 if (i * primes[j] > MAXN) break;25 check[i * primes[j]] = true;26 if (i % primes[j] == 0) {27 mu[i * primes[j]] = 0;28 break;29 } else {30 mu[i * primes[j]] = -mu[i];31 }32 }33 }34 } 35 36 37 int main()38 {39 moblus();40 int nCase;41 scanf("%d", &nCase);42 while (nCase--) {43 int n, m;44 scanf("%d %d", &n, &m);45 if (n < m) swap(n, m);46 LL ans = 0;47 for (int i = 1; i <= m; ++i) {48 ans += (LL)mu[i] * (n / i) * (m / i);49 }50 printf("%lld\n", ans);51 }52 return 0;53 }

 

转载于:https://www.cnblogs.com/ykzou/p/4791877.html

你可能感兴趣的文章
一个后端的前端学习之旅——2.先搞定gulp
查看>>
springMVC之解决ajax post 乱码
查看>>
Java8流特性和Lambda表达式
查看>>
Nginx官网翻译
查看>>
redis crackit安全事件分析
查看>>
PHP 5.6 已结束安全支持,你升级到 PHP 7 系列了吗?
查看>>
移动开发规范概述
查看>>
阿里最全面试116题:阿里天猫、蚂蚁金服、阿里巴巴面试题含答案 ...
查看>>
实时欺诈检测(风控)
查看>>
常用JQUERY插件大全
查看>>
PostgreSQL Oracle 兼容性之 - DBMS_OUTPUT.PUT_LINE
查看>>
1月15日云栖精选夜读 | 重磅公开!阿里语音识别模型端核心技术,让你“听”见未来 ...
查看>>
天文学家与阿里合作寻找“第二地球”,39光年外或有生命条件 ...
查看>>
自然语言处理hanlp的入门基础
查看>>
什么是大数据?如何成为大数据工程师?
查看>>
Spring Security OAuth 个性化token
查看>>
妙回春堂完成首轮融资,投资方主体为华园科创 ...
查看>>
java开发之使用websocket实现web客户端与服务器之间的实时通讯
查看>>
阿里云Kubernetes容器服务上体验Knative
查看>>
想知道Python的 数据驱动编程框架 Da0tabot 是怎么运行?
查看>>