前言

题目链接:洛谷UVA

题目简述

定义 \(\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\) 的幂次之和。

\[\operatorname{count}(n!) = \sum _ {i = 1} ^ {\infty} \Big \lfloor \cfrac{n}{5 ^ i} \Big \rfloor
\]

那么答案有:

\[ans = \sum _ {i = 0} ^ {n} \Bigg [ 2 \mid \sum _ {j = 1} ^ {\infty} \Big \lfloor \cfrac{i}{5 ^ j} \Big \rfloor \Bigg ]
\]

发现把 \(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\) 同奇偶。接下来继续化式子。

\[\begin{aligned}
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 题解的更多相关文章

  1. UVALive - 6575 Odd and Even Zeroes 数位dp+找规律

    题目链接: http://acm.hust.edu.cn/vjudge/problem/48419 Odd and Even Zeroes Time Limit: 3000MS 问题描述 In mat ...

  2. 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 ...

  3. Lintcode373 Partition Array by Odd and Even solution 题解

    [题目描述] Partition an integers array into odd number first and even number second. 分割一个整数数组,使得奇数在前偶数在后 ...

  4. UVa 12683 Odd and Even Zeroes(数论+数字DP)

    意甲冠军: 要求 小于或等于n号码 (0<=n <= 1e18)尾数的数的阶乘0数为偶数 思考:当然不是暴力,因此,从数论.尾数0数为偶数,然后,它将使N阶乘5电源是偶数.(二指数肯定少5 ...

  5. 【HackerRank】Find the Median(Partition找到数组中位数)

    In the Quicksort challenges, you sorted an entire array. Sometimes, you just need specific informati ...

  6. 算法与数据结构基础 - 链表(Linked List)

    链表基础 链表(Linked List)相比数组(Array),物理存储上非连续.不支持O(1)时间按索引存取:但链表也有其优点,灵活的内存管理.允许在链表任意位置上插入和删除节点.单向链表结构一般如 ...

  7. 算法与数据结构基础 - 双指针(Two Pointers)

    双指针基础 双指针(Two Pointers)是面对数组.链表结构的一种处理技巧.这里“指针”是泛指,不但包括通常意义上的指针,还包括索引.迭代器等可用于遍历的游标. 同方向指针 设定两个指针.从头往 ...

  8. 【读书笔记】Cracking the Code Interview(第五版中文版)

    导语 所有的编程练习都在牛客网OJ提交,链接: https://www.nowcoder.com/ta/cracking-the-coding-interview 第八章 面试考题 8.1 数组与字符 ...

  9. 题解 P2955 【[USACO09OCT]奇数偶数Even? Odd? 】

    很明显这题是个假入门! 小金羊一不小心点进题解发现了内幕 能看的出来都WA过Unsigned long long int 做题可以用Python,Python的变量虽然 强悍的不行! 但是我们可以用字 ...

  10. LeetCode题解之 Odd Even Linked List

    1.题目描述 2.问题分析 将链表拆分成两个,奇数节点形成一个链表,偶数节点形成另外一个链表,最后将偶数节点链表加在奇数节点链表后面. 3.代码 ListNode* oddEvenList(ListN ...

随机推荐

  1. Spring源码——@Component,@Service是如何被解析?

    引言 在Spring中,Component.Service是在工作中经常被使用到的注解,为了加深对Spring运行机制的理解,今天我们一起来看一下Spring中对Component等注解的处理方式 C ...

  2. 11-CSS定位

    01 CSS定位概念理解 01 标准流布局概念的理解 02 position属性 02 相对定位 依然在标准流中 应用场景: 在不影响其它元素的情况下,对当前元素进行微调 <!DOCTYPE h ...

  3. ubuntu20 python3 安装 easysnmp

    前言 最近在 ubuntu20 上通过 pip3 安装 easysnmp,安装失败,系统提示:net-snmp/net-snmp-config.h: No such file or directory ...

  4. TypeScript 学习笔记 — 泛型的使用(七)

    目录 一.指定函数参数类型 单个泛型 多个泛型 二.函数标注的方式 类型别名 type 接口 interface *案例分析: 三.默认泛型 四.泛型约束 五.泛型接口使用 六.类中的泛型 泛型(Ge ...

  5. webpack4.15.1 学习笔记(四) — Tree shaking

    目录 Tree shaking 原理 标记效果 副作用代码不可被删除 如何实现 Tree shaking 的几种方法 总结 Tree shaking 本质上为了消除无用的js代码,减少加载文件体积的方 ...

  6. oeasy教您玩转vim - 80 - # 宏macro

    ​ 宏 macro 回忆 这次我们了解了编码格式 屏幕显示的encoding 文件保存的fileencoding 不能搞乱了 一般用什么编的就用什么解 解铃还须系铃人 打开不正确的话,就要切到正确的上 ...

  7. [rCore学习笔记 00]总览

    写在前面 本随笔是非常菜的菜鸡写的.如有问题请及时提出. 可以联系:1160712160@qq.com GitHhub:https://github.com/WindDevil (目前啥也没有 rCo ...

  8. 使用.NET6实现动态API

    ApiLite是基于.NET6直接将Service层生成动态api路由,可以不用添加Controller,支持模块插件化,在项目开发中能够提高工作效率,降低代码量. 开发环境 .NET SDK 6.0 ...

  9. TIER 1: Appointment

    TIER 1: Appointment SQL Structured Query Language 是一种用于管理关系型数据库的编程语言.它是一种标准化的语言,用于定义.操作和管理数据库中的数据. 经 ...

  10. Node.js 处理 File

    Node.js 处理 File fs 模块 常规使用 运用递归遍历目录树 创建文件和目录 读写文件 path 模块 对于 file 的理解,此处 fs 模块 Node.js 提供了处理文件系统的内置模 ...