Odd and Even Zeroes 题解
前言
题目简述
定义 \(\operatorname{count}(num)\) 表示 \(num\) 末尾 \(0\) 的个数。给出 \(n\)(\(n \leq 10^{18}\)),求 \(\sum \limits _ {i = 0} ^ {n} [2 \mid \operatorname{count}(i!)]\)。
题目分析
对于一个 \(i\),以下记成 \(n\)。
\(n!\) 末尾 \(0\) 的个数取决于 \(1 \sim n\) 中 \(2\) 的幂次之和和 \(5\) 的幂次之和的最小值。又由于 \(2\) 的幂次肯定超过 \(5\) 的幂次之和,参见以下证明:
证明:
\(1 \sim n\) 中,\(2\) 的倍数都至少贡献了 \(1\),\(4\) 的倍数在此基础上,又多贡献了一个 \(1\),以此类推。于是,\(1 \sim n\) 中,\(2\) 的幂次之和为:
\[\sum _ {i = 1} ^ {\infty} \Big \lfloor \cfrac{n}{2 ^ i} \Big \rfloor
\]对于 \(5\) 同理:
\[\sum _ {i = 1} ^ {\infty} \Big \lfloor \cfrac{n}{5 ^ i} \Big \rfloor
\]对于每一位考虑。\(\forall i\),\(\Big \lfloor \cfrac{n}{2 ^ i} \Big \rfloor \geq \Big \lfloor \cfrac{n}{5 ^ i} \Big \rfloor\),所以 \(\sum \limits _ {i = 1} ^ {\infty} \Big \lfloor \cfrac{n}{2 ^ i} \Big \rfloor \geq \sum \limits _ {i = 1} ^ {\infty} \Big \lfloor \cfrac{n}{5 ^ i} \Big \rfloor\)。证毕。
那么,末尾 \(0\) 的个数等于 \(1 \sim n\) 中 \(5\) 的幂次之和。
\]
那么答案有:
\]
发现把 \(i\) 用 \(5\) 进制表示成 \(i = \overline{x_mx_{m-1}\ldots x_0}\),那么 \(\Big \lfloor \cfrac{}{5^j} \Big \rfloor\) 就是 \(5\) 进制下的移位。也即 \(\Big \lfloor \cfrac{i}{5^j} \Big \rfloor = \overline{x_mx_{m-1}\ldots x_j}\)。我们只关心这个式子的奇偶性。拆开:\(\overline{x_mx_{m-1}\ldots x_j} = \sum \limits _ {k = j} ^ {m} 5 ^ {k - j} x_k\),而 \(5 \bmod 2 = 1\),故上式与 \(\sum \limits _ {k = j} ^ {m} x_k\) 同奇偶。接下来继续化式子。
ans &= \sum _ {i = 0} ^ {n} \Bigg [ 2 \mid \sum _ {j = 1} ^ {\infty} \Big \lfloor \cfrac{i}{5 ^ j} \Big \rfloor \Bigg ] \\
&= \sum _ {i = 0} ^ {n} \Bigg [ 2 \mid \sum _ {j = 1} ^ {m} \sum \limits _ {k = j} ^ {m} x_k \Bigg ] \\
&= \sum _ {i = 0} ^ {n} \Bigg [ 2 \mid \sum _ {j = 1} ^ {m} x_j \times j \Bigg ] \\
&= \sum _ {i = 0} ^ {n} \Bigg [ 2 \mid \sum _ {j = 1 \land j \bmod 2 = 1} ^ {m} x_j \Bigg ] \\
\end{aligned}
\]
也即,\(n!\) 某位有偶数个 \(0\),等价于其在 \(5\) 进制表示下,奇数位的和能否被 \(2\) 整除。答案就是 \(0 \sim n\) 中,在 \(5\) 进制表示下,奇数位的和能被 \(2\) 整除的数字的个数。这个使用数位 DP 即可。状态记录剩余几位、目前奇数位的和被 \(2\) 除的余数。
代码
#include <cstdio>
long long n, f[30][2];
int yzh[30], len;
long long dp(int len, bool limit, bool sum) {
if (!~len) return !sum;
if (!limit && f[len][sum]) return f[len][sum];
long long res = 0;
for (int i = limit ? yzh[len] : 4; ~i; --i)
res += dp(len - 1, limit && i == yzh[len], (len & 1) ? (sum ^ (i & 1)) : sum);
if (!limit) f[len][sum] = res;
return res;
}
inline long long solve() {
for (len = -1; n; yzh[++len] = n % 5, n /= 5);
return dp(len, true, 0);
}
signed main() {
while (scanf("%lld", &n), ~n) printf("%lld\n", solve());
return 0;
}
Odd and Even Zeroes 题解的更多相关文章
- UVALive - 6575 Odd and Even Zeroes 数位dp+找规律
题目链接: http://acm.hust.edu.cn/vjudge/problem/48419 Odd and Even Zeroes Time Limit: 3000MS 问题描述 In mat ...
- UVA 12683 Odd and Even Zeroes(数学—找规律)
Time Limit: 1000 MS In mathematics, the factorial of a positive integer number n is written as n! an ...
- Lintcode373 Partition Array by Odd and Even solution 题解
[题目描述] Partition an integers array into odd number first and even number second. 分割一个整数数组,使得奇数在前偶数在后 ...
- UVa 12683 Odd and Even Zeroes(数论+数字DP)
意甲冠军: 要求 小于或等于n号码 (0<=n <= 1e18)尾数的数的阶乘0数为偶数 思考:当然不是暴力,因此,从数论.尾数0数为偶数,然后,它将使N阶乘5电源是偶数.(二指数肯定少5 ...
- 【HackerRank】Find the Median(Partition找到数组中位数)
In the Quicksort challenges, you sorted an entire array. Sometimes, you just need specific informati ...
- 算法与数据结构基础 - 链表(Linked List)
链表基础 链表(Linked List)相比数组(Array),物理存储上非连续.不支持O(1)时间按索引存取:但链表也有其优点,灵活的内存管理.允许在链表任意位置上插入和删除节点.单向链表结构一般如 ...
- 算法与数据结构基础 - 双指针(Two Pointers)
双指针基础 双指针(Two Pointers)是面对数组.链表结构的一种处理技巧.这里“指针”是泛指,不但包括通常意义上的指针,还包括索引.迭代器等可用于遍历的游标. 同方向指针 设定两个指针.从头往 ...
- 【读书笔记】Cracking the Code Interview(第五版中文版)
导语 所有的编程练习都在牛客网OJ提交,链接: https://www.nowcoder.com/ta/cracking-the-coding-interview 第八章 面试考题 8.1 数组与字符 ...
- 题解 P2955 【[USACO09OCT]奇数偶数Even? Odd? 】
很明显这题是个假入门! 小金羊一不小心点进题解发现了内幕 能看的出来都WA过Unsigned long long int 做题可以用Python,Python的变量虽然 强悍的不行! 但是我们可以用字 ...
- LeetCode题解之 Odd Even Linked List
1.题目描述 2.问题分析 将链表拆分成两个,奇数节点形成一个链表,偶数节点形成另外一个链表,最后将偶数节点链表加在奇数节点链表后面. 3.代码 ListNode* oddEvenList(ListN ...
随机推荐
- 搭建springboot redis项目
1.创建项目 如果出现init失败(需要等待网络可以正常连接) 或者运行主类的时候报错(错误: 找不到或无法加载主类),需要重新导入maven项目再重新编译试试. 2.引入pom jar <?x ...
- C#如何创建一个可快速重复使用的项目模板
写在前面 其实很多公司或者资深的开发都有自己快速创建项目的脚手架的,有的是魔改代码生成器实现,有的直接基于T4,RazorEngine等模板引擎打造:但无论如何,其最终目的其实就是搭建一个自定义项目模 ...
- 利用 device_map、torch.dtype、bitsandbytes 压缩模型参数控制使用设备
为了更好的阅读体验,请点击这里 device_map 以下内容参考 Huggingface Accelerate文档:超大模型推理方法 在 HuggingFace 中有个重要的关键字是 device_ ...
- .NET 个人博客-首页排版优化-2
个人博客-首页排版优化-2 原本这篇文章早就要出了的,结果之前买的服务器服务商跑路了,导致博客的数据缺失了部分.我是买了一年的服务器,然后用了3个月,国内跑路云太多了,然后也是花钱重新去别的服务商买了 ...
- SQLServer统计采集数据库相关信息
在MS Sql Server中可以能过以下的方法查询出磁盘空间的使用情况及各数据库数据文件及日志文件的大小及使用利用率: 1.查询各个磁盘分区的剩余空间:Exec master.dbo.xp_fixe ...
- Java常见问题-汇总
一.面试到底在问些什么东西? 首先你要知道,面试官的提问和你简历上写的内容是紧密联系的,所以你简历上写的技能一定要会. 一般面试包括下面几方面知识类型: Java基础.多线程.IO与NIO.虚拟机.设 ...
- Mysql的Innodb和MyISAM引擎的区别
区别项 Innodb MyISAM 事务 支持 不支持 锁粒度 行锁,适合高并发 表锁,不适合高并发 是否默认 默认 非默认 支持外键 支持外键 不支持 适合场景 读写均衡,写 ...
- 精品 IDEA 插件大汇总!值得收藏
轻松提高 Java 开发效率 俗话说,工欲善其事,必先利其器.想要提升编程开发效率,必须选择一款顺手的开发工具. 对于 Java 开发者,JetBrains IDEA 无疑是目前最主流的开发工具,既简 ...
- Docker 容器开发:虚拟化
Docker 容器开发:虚拟化 Docker 的核心价值在于虚拟化或者说环境隔离[通过虚拟化技术实现虚拟环境],解决环境配置和部署的依赖问题实现解耦 我对虚拟化的理解源自<Operating S ...
- python 列表append和 的区别??
python列表中的合并 python列表中append方法是给列表增加一个元素,而'+='是增加上该符号后边的元素,类似于extend方法 不知道对错,先记下来.我学的append方法是在列表最后追 ...