首页 > 其他分享 >LibreOJ 3591 「USACO 2018.02 Platinum」Cow Gymnasts

LibreOJ 3591 「USACO 2018.02 Platinum」Cow Gymnasts

时间:2024-03-16 11:23:06浏览次数:22  
标签:2018.02 Platinum 3591 gcd limits sum 高度 i64 mod

以 \(0\) 为初始下标。

考虑到这个平台之间的转移不是很好处理,于是考虑换个角度,考虑每个高度。
这里定义高度为 \(i\) 的奶牛就是下一次操作要走 \(i\) 步的奶牛。

然后考虑去分析合法序列的性质。

性质 \(1\):高度为 \(x\) 的奶牛在移动后的高度依然为 \(x\),即这个过程可以看作每个高度中的平移。
证明:
考虑高度最大值 \(p\),那么对于高度为 \(p\) 的平台位置 \(x\),那么以这个平台开始的前 \(p\) 个平台肯定都需要过来一个奶牛,那么 \(x - p\) 的高度肯定为 \(p\)。
然后这部分是不会影响 \(\le p - 1\) 的这些高度的,便可以直接删掉这些奶牛,继续往下分析,就可以证出了。

考虑到对于高度为 \(p(p \ge 1)\),相当于是每次平移 \(p\) 步,那么就会有 \(\gcd(p, n)\) 个循环节,这个是因为循环长度 \(l\) 满足 \(pl=kn\),可以知道 \(l = \frac{\operatorname{lcm}(p, n)}{{p}}\),对于循环节数量又有 \(cl = n\),所以可以得到 \(c = \gcd(p, n)\)。

性质 \(2\):对于最高高度 \(p(p\ge 1)\),高度 \(< p\) 的奶牛都是满的。
证明:
考虑对于 \(p - 1\),那么若 \(x\) 处有高度为 \(p\) 的,那么 \((x + p)\bmod n\) 处需要有高度为 \(p - 1\) 的,不然奶牛会掉下去,类似的,\((x + kp)\bmod n\) 都需要有高度为 \(p - 1\) 的。
相当于开头为 \((x + kp)\bmod (p - 1)\) 的循环节都需要选,发现因为 \(\operatorname{lcm}(p, p - 1) = p(p - 1)\),所以 \(0 \le k < p - 1\) 对应的 \((x + kp)\bmod (p - 1)\) 的值都是不同的且肯定都走过了,所以每个循环节都需要有奶牛。
所以 \(p - 1\) 层是满的。
那么再往下的层,因为其上面一层是满的,其肯定也得是满的。

于是就可以考虑计数。
对于最高高度 \(= 0\) 的,方案数就是 \(1\)。
否则对于最高高度 \(= i\) 的,有 \(\gcd(i, n)\) 个循环节,可选可不选但必须选至少一个,对于不选的平台,其高度是确定的,所以方案数就为 \(2^{\gcd(i, n)} - 1\)。
答案就为 \(1 + \sum\limits_{i = 1}^{n - 1} (2^{\gcd(i, n)} - 1) = 1 - (n - 1) + \sum\limits_{i = 1}^{n - 1} 2^{\gcd(i, n)}\)。

时间复杂度 \(O(n\log n)\)。

代码
#include<bits/stdc++.h>
using i64 = long long;
const i64 mod = 1e9 + 7;
inline i64 qpow(i64 a, i64 b) {i64 v = 1; while (b) b & 1 && ((v *= a) %= mod), b >>= 1, (a *= a) %= mod; return v;}
int main() {
    i64 n; scanf("%lld", &n);
    i64 ans = (1 - (n - 1) % mod + mod) % mod;
    for (i64 i = 1; i < n; i++) (ans += qpow(2, std::__gcd(i, n))) %= mod;
    printf("%lld\n", ans);
    return 0;
}

考虑优化。
因为 \(\gcd(i, n) | n\),所以 \(\gcd(i, n)\) 的取值只会有 \(O(\sqrt{n})\) 种。
所以原式可以写成 \(1 - (n - 1) + \sum\limits_{1\le g < n, g | n} 2^g\sum\limits_{i = 1}^{n - 1} [\gcd(i, n) = g]\)。
考虑 \(\sum\limits_{i = 1}^{n - 1} [\gcd(i, n) = g] = \sum\limits_{i = 1}^{\frac{n}{g}} [\gcd(i, \frac{n}{g}) = 1]=\varphi(\frac{n}{g})\)。
于是原式为 \(1 - (n - 1) + \sum\limits_{1\le g < n, g | n} 2^g \varphi(\frac{n}{g}) = 1 - (n - 1) + \sum\limits_{1< g \le n, g | n} 2^{\frac{n}{g}} \varphi(g)\)。
可以在爆搜出 \(g\) 的同时维护 \(\varphi\)。

时间复杂度 \(O(\sqrt{n}\log n)\)。

代码
#include<bits/stdc++.h>
using i64 = long long;
using i128 = __int128_t;
const i64 mod = 1e9 + 7;
inline i64 qpow(i64 a, i64 b) {i64 v = 1; while (b) b & 1 && ((v *= a) %= mod), b >>= 1, (a *= a) %= mod; return v;}
i64 n; int m;
std::vector<i64> P; std::vector<int> c;
i64 ans;
void dfs(i64 d, i64 phi, int w) {
    if (w == m) {
        d != 1 && ((ans += qpow(2, n / d) * phi) %= mod, 1);
        return ;
    }
    dfs(d, phi, w + 1);
    for (int i = 1; i <= c[w]; i++) d *= P[w], phi *= P[w] - (i == 1), dfs(d, phi, w + 1);
}
int main() {
    scanf("%lld", &n);
    i64 N = n;
    for (i64 i = 2; i * i <= N; i++) {
        int cnt = 0;
        while (N % i == 0) cnt++, N /= i;
        cnt && (P.push_back(i), c.push_back(cnt), 1);
    }
    if (N > 1) P.push_back(N), c.push_back(1);
    m = P.size();
    ans = (1 - (n - 1) % mod + mod) % mod;
    dfs(1, 1, 0);
    printf("%lld\n", ans);
    return 0;
}

标签:2018.02,Platinum,3591,gcd,limits,sum,高度,i64,mod
From: https://www.cnblogs.com/rizynvu/p/18076848

相关文章

  • CF1847E Triangle Platinum? 题解
    感谢@swiftc管理反馈的信息,对于题目大意确定的东西进行了完善。交互题。题目大意有一个长度为\(n\)的序列\(a\)满足\(1\leqa_i\leq4\),现在你可以进行不超过\(5500\)次询问,每次询问询问三个数\(1\leqi<j<k\leqn\),你将会得到\(a_i,a_j,a_k\)构成的三角形......
  • 编译Platinum SDK库
    PlatinumSDK是一款开源的库,方便用户在各种平台上快算实现DLNARender功能,本文章主要介绍,使用AndroidNDK编译PlatinumSDK,方便后续在Android平台上使用。一.Platinum源代码下载地址:https://github.com/plutinosoft/Platinum二.编译环境准备:Platinum官方的Android编译介绍只......
  • USACO 2023 US Open Platinum Triples of Cows
    洛谷传送门LOJ传送门hottea.一次删点操作的影响太大了,考虑添加虚点以减小影响(相同的套路在CF1882E2TwoPermutations(HardVersion)也出现过)。具体而言,我们把第\(i\)条边\((u,v)\)变成\((u,n+i),(v,n+i)\)。称编号\(\len\)的点为黑点,编号\(>n\)的点......
  • USACO 2020.12 Platinum Spaceship
    洛谷传送门LOJ传送门考虑剥路径最大值dp,设\(f_{k,i,j}\)为\(i\toj\)中按的最大的按钮\(\lek\)的方案数。转移枚举按下最大值按钮的点\(w\),有:\[f_{k,i,j}=\sum\limits_{(u,w),(w,v)\inE}f_{k-1,i,u}f_{k-1,v,j}\]在外层枚举\(w\),设\(g_i\)......
  • USACO 2021.12 Platinum Paired Up
    洛谷传送门LOJ传送门如果\(T=1\),可以把重量全部取相反数转化成\(T=2\)。接下来只考虑\(T=2\)的情况。下文的\(m\)代表原题中的\(K\)。设第\(i\)个G牛的位置和重量分别为\(a_{0,i},b_{0,i}\),第\(i\)个H牛的位置和重量分别为\(a_{1,i},b_{1,i}\)......
  • Oracle最高可用性架构(MAA)|铂金级(PLATINUM)
    1、什么是MAAMAA即最高可用性架构(MaximumAvailabilityArchitecture )Oracle最高可用性架构(MAA)为Oracle数据库提供了架构、配置和生命周期最佳实践参考之前的文章:1、Oracle最高可用性架构(MAA)|青铜级(BRONZE)https://www.cnblogs.com/mingfan/p/16804556.html2、Oracle最......
  • USACO 2023 January Contest, Platinum 题解
    TractorPaths题意:给定\(n\)个不交区间,两个区间之间有边当且仅当这两个区间的交非空。\(Q\)次询问,每次给定\(u,v\),求从\(u\)到\(v\)的最短路和最短路可能经过的点......
  • USACO2023 一月月赛 Platinum 3
    Platinum3分析树上的最优化问题先不动脑子DP一波。用\(f[i]\)表示将以\(i\)为根的子树中,所有子树都满足题设开灭条件所需要的最少次数。现在把这个子树画成下图这样,假......
  • USACO2023 一月月赛 Platinum 2
    受到样例的第四个询问启发,我们可以发现一个性质:一开始先让魔力积累,然后肯定是在最晚的那个时候,我们去把魔力池里该取的魔力取走,而不是一开始就和一个无头苍蝇一样在图上乱......
  • 【USACO2021 February Contest Platinum】Minimizing Edges(图论,贪心)
    传送门设\(d_0(u),d_1(u)\)分别表示\(1\)到\(u\)的偶数长最短路和奇数长最短路。那么即为要求\(G,G'\)的\(d_0,d_1\)都相同。先特判掉二分图的情况,这样任意\(......