yzh 和她送你的魔法石子

news/2024/9/20 7:16:51/文章来源:https://www.cnblogs.com/XuYueming/p/18419122

题意简述

yzh 在一个特殊的日子里,送给你了 \(n\) 颗具有魔法的石子!你当然知道这是她为你准备的惊喜。她偷偷告诉你,为了使它们的魔法被释放出来,只有把这些石子分成若干堆,并且每一堆石子个数都能表示成 \(3x^2-3x+1\) 的形式,其中 yzh 希望让 \(x > 1\)。以你的聪明才智,不久就想到了划分的方法。并且你自信地说:“无论你给我多少颗石子,我都可以找到一种划分方案!”。这时她又凑到你耳边说,你需要让堆数最少,这样魔法的力量会更加集中,发挥出最美丽的效果。这对你来说还不是小菜一碟?你思索了一会,说道:“我编写一段程序就可以!”

\(n \leq 3 \times 10^{11}\),多测,\(T \leq 10^3\)

题目分析

经过背包打表知道,这题答案不多,最多才 \(8\),显然需要大力分讨。

\(f(x) = 3x^2-3x+1\)。手玩一会不难发现,\(f(x + 1) - f(x) = 6x\),这是一个美妙的性质。不妨列出来:

\[\begin{aligned} f(1) &= 1 + 6 \times (0) \\ f(2) &= 1 + 6 \times (0 + 1) \\ f(3) &= 1 + 6 \times (0 + 1 + 2) \\ f(4) &= 1 + 6 \times (0 + 1 + 2 + 3) \\&\ \ \vdots \\ f(x) &= 1 + 6 \times \Big (0 + 1 + \cdots + (x - 1) \Big) \end{aligned} \]

一定存在一种划分方案将在最后说明。假设我们将 \(n\) 分成了 \(m\) 份,那么我们的 \(n\) 就会可以被表示成 \(m + 6 \times \sum \limits _ {i = 1} ^ m \Big( 0 + 1 + \cdots + (x_i - 1) \Big )\)

如果 \(6 \mid n\),说明 \(6 \mid m\),结合我们得出的 \(m \leq 8\),可知此时必有 \(m = 6\)。接下来尝试构造,证明一定存在这样的方案。

此时有 \(\cfrac{n - m}{6} = \sum \limits _ {i = 1} ^ 6 \Big( 0 + 1 + \cdots + (x_i - 1) \Big )\)。我们只需要说明,用后面的求和能表示出任意给定的 \(w \geq 0\)。事实上,我们有一个更强的结论:能使用不超过 \(3\) 个形如 \(1 + \cdots + x\) 的数表示出任意自然数,至于剩下的数,填 \(x_i = 1\) 即可。这正是根据了「费马多边形数定理」,原定理为:任意正数可以表示为不超过 \(n\)\(n\) 边形数的和。

Fermat polygonal number theorem [1]

every positive integer is a sum of at most n n-gonal numbers.

所以,当 \(6 \mid n\) 时,我们有答案为 \(6\),那对于其他的 \(n\) 呢?在 \(\bmod 6\) 之后会有什么规律吗?

我们关注 \(n \equiv 1 \pmod 6\) 的情况,此时如果 \(n\) 恰好能被表示为一个 \(f(x)\),答案就为 \(1\)。这个判断就是解个简单的一元二次方程。否则,由于 \(m \equiv 1 \pmod 6\),此时必有 \(m = 7\),并且方案也是存在的。考虑任意选出一个小于 \(n\)\(f(x)\)\(n\) 减去它之后就是 \(6 \mid n\) 的情况。

类似考虑 \(n \equiv 2 \pmod 6\) 的情况。如果 \(n\) 能被表示成两个 \(f(x)\) 的和,答案就是 \(2\),否则为 \(8\)。发现,由于 \(n \leq 3 \times 10^{11}\),所以 \(\max \left \{ x \mid f(x) \leq 3 \times 10^{11} \right \} = 316228\),我们完全可以枚举其中一个 \(f(x)\),然后看看另一个 \(f(x)\) 是否存在即可。

对于 \(n \bmod 6 > 2\) 的情况也是一样的吗?并不是。还记得我们一开始讨论的 \(6 \mid n\) 吗?我们此时已经有 \(n \bmod 6 \geq 3\),也就是说,一定能够构造出方案来了。此时答案就是 \(n \bmod 6\)

我们同时证明了原问题一定有解。

综上,我们可以把答案表示为:

\[ans = \left\{ \begin{matrix} 6 & \text{ if } n \equiv 0 \pmod 6 \\ 1 & \text{ if } n \equiv 1 \pmod 6 \ \text{and} \ \exists x, n = f(x) \\ 7 & \text{ if } n \equiv 1 \pmod 6 \ \text{and} \ \forall x, n \neq f(x) \\ 2 & \text{ if } n \equiv 2 \pmod 6 \ \text{and} \ \exists x,y, n = f(x) + f(y) \\ 8 & \text{ if } n \equiv 2 \pmod 6 \ \text{and} \ \forall x,y, n \neq f(x) + f(y) \\ n \bmod 6 & \text{ if } n \bmod 6 \in [3, 5] \end{matrix}\right. \]

代码

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;long long n;template <typename T>
inline long long f(T x) {return 3ll * x * x - 3ll * x + 1;
}inline bool check(long long x) {long long y = (3 + sqrt(12 * x - 3)) / 6 + 1e-20;return f(y) == x;
}void solve() {scanf("%lld", &n);int tmp = n % 6;if (!tmp) return puts("6"), void();if (tmp > 2) return printf("%d\n", tmp), void();if (tmp == 1) return puts(check(n) ? "1" : "7"), void();for (int i = 1; f(i) <= n / 2; ++i)if (check(n - f(i))) return puts("2"), void();puts("8");
}signed main() {int t; scanf("%d", &t);while (t--) solve();return 0;
}

  1. wikipedia, https://en.wikipedia.org/wiki/Fermat_polygonal_number_theorem ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/799528.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C----函数递归之反汇编

环境 win10 vc6.0 debug 代码 关于求阶层问题:n!=n(n-1)!;(n-1)! = (n-1)(n-2)! 例如5!=5(4)! 4!=43! 3!=32! 2!=21 函数递归的出口是1,所以函数递归最重要的条件是去寻找递归的出口 int fun(int i) {int sum = 0;if (i == 1){return 1;}else{sum = i*fun(i-1);}return sum …

地平线占用预测 FlashOcc 参考算法-V1.0

1.简介 3D Occupancy Networks 的基本思路是将三维空间划分成体素网格,并对每个网格进行各类感知任务的预测。目前以网格为中心的方法能够预测每个网格单元的占用率、语义类别、未来运动位移和实例信息。3D occupancy 可以对道路障碍物进行更细粒度的划分,同时获取更精确的占…

手脱upx

其实已经是大一下刚开始的事情了,补个档 手动脱壳の新年快乐 查壳,有壳,UPXX32dbg打开文件,查看初始断点点击PUSHAD跟进,CTRL+*设置EIP,开始F8步过,寻找ESP寄存器第一次单个变红的地址此时的内存窗口开始步过第一次步过就发现ESP单个变红,右键跟进内存窗口然后在第一个…

使用firemin降低火狐内存占用

这些年一直使用火狐浏览器,之前一直在AMD平台的机器使用,没有遇到过内存占用过大的问题(可能也与平台无关)。现在在Intel CPU的机器上使用,时间一久,内存就占用很大。试过Firefox/内存消耗严重里面的办法,效果不明显。也试过修改about:config里面的一些选项,也没有达到…

代码随想录算法 - 回溯算法1

题目1 77. 组合 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1: 输入:n = 4, k = 2 输出: [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ]示例 2: 输入:n = 1, k = 1 输出:[[1]]提示:1 <= n <= 20 1 <= k…

错误

PID自己搭的时候,要注意积分模块的位置,搞不明白好久了,原来是我把积分模块的位置放错了。直接用增益模块不容易出错。

OSG开发笔记(三十):OSG加载动力学仿真K模型文件以及测试Demo

前言Osg需要打开模型文件,但是遇到显示动力学仿真的K模型文件,.k文件是一种描述材料属性的文件,比如密度、弹性模量等,该模型文件不是常规中间开放格式,无法直接支持,需要自定义解析并且重建三维模型。 Demo实际非常流程,因为视频转gif导致部分看起来不行:   交互流畅…

0918高数一千题,多元函数积分学

T17.第一型曲线积分空间形式 用斯托克斯公式化成第二型曲面积分 解第二型曲面积分,用高斯公式或者投影转换法,后者注意正负号,上正下负,前正后负 T18.换路径,但是x=1左半段不能化成lnx算 T19.求偏导就对对应字母求就行,不用对y导x T20.多元极值AC-B2>0A>0,极小 A<…

Dynamic Locomotion in the MIT Cheetah 3 Through Convex Model-Predictive Control

1. Swing Leg Control\(J_i \in R^{3*3}\) 是足端雅可比;\(\tau _{i,ff}\) 是前馈力矩 \(\Lambda \in R^{3*3}\)是操作空间惯性矩阵;\(a_{i,ref} \in R^{3*3}\)是机体坐标系下的参考加速度 q是关节角度;\(C_i \dot{q}_i + G_i\)是科里奥利力和重力 2. Ground Force Control …

多机训练时的环境变量

多机训练时的环境变量 通过设置环境变量配置分布式训练,仅仅是为了在交互式 Python 环境下,方便查看实验效果。如果不是学习、试验目的,而是生产需求,可以直接通过 oneflow.distributed.launch 启动分布式训练,该模块内部根据命令行参数,自动设置了必要的环境变量。 1)M…

[Java基础]Stream流

当我第一次阅读 Java8 中的 Stream API 时,说实话,我非常困惑,因为它的名字听起来与 Java I0 框架中的 InputStream 和 OutputStream 非常类似。但是实际上,它们完全是不同的东西。 Java8 Stream 使用的是函数式编程模式,如同它的名字一样,它可以被用来对集合进行链状流式…