51nod 1180 方格射击游戏(莫比乌斯反演)
发布日期:2021-11-02 09:48:36
浏览次数:6
分类:技术文章
本文共 2455 字,大约阅读时间需要 8 分钟。
莫比乌斯反演
令F(n)和f(n)都是定义在非负整数域上的两个函数,并且它们之间满足:
F ( n ) = ∑ d ∣ n f ( d ) F(n) = \sum_{d | n} {f(d)} F(n)=d∣n∑f(d) 即: f ( n ) = ∑ d ∣ n μ ( d ) F ( ⌊ n d ⌋ ) f(n) = \sum_{d | n} {μ(d)F(⌊\frac{n}{d}⌋)} f(n)=d∣n∑μ(d)F(⌊dn⌋) 常用: F ( n ) = ∑ n ∣ d f ( d ) F(n) = \sum_{n | d} {f(d)} F(n)=n∣d∑f(d) f ( n ) = ∑ n ∣ d μ ( d n ) F ( d ) f(n) = \sum_{n | d} {μ(\frac{d}{n})F(d)} f(n)=n∣d∑μ(nd)F(d) 莫比乌斯反演模板const int N = 5000005;bool vis[N];int mob[N], prime[N];int tot;//用来记录prime的个数void Mobius(int n) { //求得莫比乌斯函数值 memset(prime, 0, sizeof(prime)); memset(mob, 0, sizeof(mob)); memset(vis, 0, sizeof(vis)); tot = 0, mob[1] = 1; for (int i = 2; i <= n; i++) { if (!vis[i]) { prime[tot++] = i; mob[i] = -1; } for (int j = 0; j < tot && i * prime[j] <= n; j++) { vis[i * prime[j]] = 1; if (i % prime[j]) mob[i * prime[j]] = -mob[i]; else { mob[i * prime[j]] = 0; break; } } }}
1180 方格射击游戏
题目
M*N的方格矩阵,一个人在左下角格子的中心,除他所站位置外,其他格子的中心都有一个敌人,他一次可发射一枚子弹干掉一条直线上的所有敌人,问至少要发射多少子弹才能干掉所有敌人。
输入
输入2个数m, n,中间用空格分隔,对应矩阵的大小。(1 <= m,n <= 5 * 10^6)
输出
输出发射子弹的数量。
输入样例
2 10
输出样例
11
代码
#includeusing namespace std;typedef long long ll;const int N = 5000005;int mob[N], vis[N], prime[N], sum[N];int tot;//用来记录prime的个数void Mobius(int n) { //求得莫比乌斯函数值 memset(prime, 0, sizeof(prime)); memset(mob, 0, sizeof(mob)); memset(vis, 0, sizeof(vis)); tot = 0, mob[1] = 1; for (int i = 2; i <= n; i++) { if (!vis[i]) { prime[tot++] = i; mob[i] = -1; } for (int j = 0; j < tot && i * prime[j] <= n; j++) { vis[i * prime[j]] = 1; if (i % prime[j]) mob[i * prime[j]] = -mob[i]; else { mob[i * prime[j]] = 0; break; } } } for (int i = 1; i <= n; ++i) { sum[i] = sum[i - 1] + mob[i]; }}int main() { Mobius(N - 1); int n, m; scanf("%d%d", &n, &m); if (n == 1 && m == 1) puts("0"); else if (n == 1 || m == 1) puts("1"); else { --n; --m; if (n > m) swap(n, m); ll ans = 2; for (int L = 1, R; L <= n; L = R + 1) { R = min(n / (n / L), m / (m / L)); ans += (ll) (sum[R] - sum[L - 1]) * (ll) (n / L) * (ll) (m / L); } printf("%lld\n", ans); } return 0;}
转载地址:https://blog.csdn.net/weixin_43820352/article/details/108246485 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月02日 10时19分39秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
如何理解输入流输出流?_CodingPark编程公园
2019-04-26
Python类|实例|方法|继承_专题_CodingPark编程公园
2019-04-26
机器学习心得_CodingPark编程公园
2019-04-26
自然语言工程师心得概述_CodingPark编程公园
2019-04-26
for循环那点事儿_CodingPark编程公园
2019-04-26
Int -> List | List -> Int _ CodingPark编程公园
2019-04-26
如何在junit中使用SpringFramework的Ioc容器
2021-06-29
一个案例教你理解Spring面向切面编程(Spring Aop)
2021-06-29
手把手教你整合SSM框架
2021-06-29
自己造个简单数据校验的注解@Value和@Mail
2021-06-29
Poj百练 4148:生理周期 (分类:枚举)
2021-06-29
Java如何读写注册表
2021-06-29
java如何利用模板文件生成word文档
2021-06-29
java读写xlsx格式的MS Excel文件
2021-06-29
vue的一些基础知识点
2021-06-29
webpack错误记录(不定期更新)
2021-06-29
Poj百练 2692:假币问题 (分类:模拟)
2021-06-29
SpringBoot实现一个文件上传服务
2021-06-29
前后分但文件上传与多文件上传,前端实现
2021-06-29
Poj百练 2711:合唱队形 (分类:动态规划)
2021-06-29