首页 > 其他分享 >yzh 的石子

yzh 的石子

时间:2024-09-18 20:45:43浏览次数:5  
标签:pmod text 石子 long times Big yzh equiv

题意简述

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 ↩︎

标签:pmod,text,石子,long,times,Big,yzh,equiv
From: https://www.cnblogs.com/XuYueming/p/18419122

相关文章

  • P1775 石子合并(弱化版)
    P1775石子合并(弱化版)感觉dp太难了,这真的感觉太难学了,但是还要写题记积累啊,唉!感觉不用讲题意了(那你也别讲题解了)就是石子之间可以合并,合并的代价是这堆石子数,问如何合并全部石子后总代价最小。考虑用区间dp,设状态为\(dp[i][j]\)为区间\([i,j]\)的最小代价,转移时先枚举区......
  • 51nod 石子分配
    可以发现步数限制把数轴变为了环。环之间不可以交换,环内相邻两点可以交换,然后我们只需要对每个环操作,最后累加。对于环上的每个石子堆,我们需要将其石子数调整到均值\(avg\)。因此,我们首先计算每个堆石子相对于\(avg\)的偏差,即\(nowa[i]-avg\)。因为相邻节点不一定能凑齐......
  • 石子合并
    **(区间DP)**0.思路关键点:最后一次合并一定是左边连续的一部分和右边连续的一部分进行合并如何分类:最后一次分界线的位置来分类,分成k类之后,每一类取最小代价步骤:1.枚举[l,r]区间的长度2.对于每个长度的区间枚举起点————合并开始的位置for(inti=1;i+len-1<=......
  • DP优化 笔记(harryzhr)
    DP优化数据结构优化单调队列优化CF372CWatchingFireworksisFun简单DP题,推柿子,然后套单调队列。SCOI2010股票交易可买可卖,所以状态不能钦定买还是卖,尽量让状态简单一点可以是优化更简单,只是转移分讨更多,设\(f[i][j]\)表示第\(i\)天结束时,有\(j\)股票时的最......
  • 【解题报告】「NOI 1995」石子合并
    一个圆形操场上摆放\(n\(1\len\le100)\)堆石子。现要将\(n\)堆石子合并成一堆,每次只能选相邻的\(2\)堆合并成新的一堆,代价为新的一堆的石子数。求将\(n\)堆石子合并成一堆的最小代价和、最大代价和。“最大代价和”的转移证明\(\color{blue}{\text{结论}}\):对于\(......
  • 【区间dp】石子合并
    原题传送门题目描述在一个圆形操场的四周摆放\(N\)堆石子,现要将石子有次序地合并成一堆,规定每次只能选相邻的\(2\)堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。试设计出一个算法,计算出将\(N\)堆石子合并成\(1\)堆的最小得分和最大得分。输入格式数据的......
  • 【leetcode 1510 石子游戏】【记忆化搜索】
    存在和对于一切的语言importjava.util.Arrays;classSolution{publicbooleanwinnerSquareGame(intn){dp=newBoolean[n+1];dp2=newBoolean[n+1];Arrays.fill(dp,null);Arrays.fill(dp2,null);dp[0]=fa......
  • G. 石子游戏
    原题链接题解1.如果轮到我时场上有\(n\)颗石子,那么在我操作一步之后石子的范围是\([n+1,2n]\)2.如果轮到我时,场上有\(k/2-(1-k%2)\)颗石子,那么轮到对方走的时候,对方一定能走到k3.记录所有\(k/2-(1-k%2)\)如果存在一个\(k_i=n\)那么alice必输,因为alice永远无法走到\(......
  • 洛谷题单指南-动态规划3-P1880 [NOI1995] 石子合并
    原题链接:https://www.luogu.com.cn/problem/P1880题意解读:计算n堆石子合并的最小、最大得分,只不过这n堆石子是环形的,也就是首、尾也相邻,是区间DP的升级版-环形DP问题。解题思路:如果是常规区间DP的方法:对于n堆石子,考察区间的长度范围是1~n先枚举左端点i,范围是1~n再计算右......
  • 洛谷题单指南-动态规划3-P1775 石子合并(弱化版)
    原题链接:https://www.luogu.com.cn/problem/P1775题意解读:计算合并石子的最小代价,区间DP。解题思路:状态表示:dp[i][j]表示将第i~j堆石子合并的最小代价,m[i]表示第i堆石子质量,s[i]表示前i堆石子质量前缀和状态转移:考虑最后一次合并,设最后一次合并是将i~k合成的一堆与k+1~j合成......