首页 > 其他分享 >洛谷 P1891 疯狂 LCM

洛谷 P1891 疯狂 LCM

时间:2022-12-01 16:38:20浏览次数:53  
标签:ch 洛谷 gcd int nd sum P1891 frac LCM

\(\text{lcm}\) 不好处理,转化为 \(\gcd\):

\[n \sum_{i = 1}^n \frac{i}{\gcd(i, n)} \]

\(\gcd\) 相关题目的套路——枚举因数:

\[n \sum_{d | n} \sum_{i = 1}^n \frac id [\gcd(\frac id, \frac nd) = 1] \]

整理:

\[n \sum_{d | n} \sum_{i = 1}^{\frac nd} i[\gcd(i, \frac nd) = 1] \]

因为枚举了 \(n\) 的每个因数 \(d\),所以 \(\dfrac nd \iff d\):

\[n \sum_{d | n} \sum_{i = 1}^{d} i[\gcd(i, d) = 1] \]

考虑 \(\sum\limits_{i = 1}^d i[\gcd(i, d) = 1]\) 的求解。

已知满足条件的 \(i\) 有 \(\varphi(d)\) 个,受等差数列求和公式的启发,考虑将满足条件的 \(i\) 两两配对,使得每对的和是定值。

若 \(\gcd(i, d) = 1\),则一定有 \(\gcd(d - i, d) = 1\)。

证明:

设 \(\gcd(d - i, d) = k\),令 \(d - i = xk, d = yk, i = (y - x)k\),易得 \(\gcd(x, y) = 1\),进一步可以得到 \(\gcd(y, y - x) = 1\)。

两边同时乘上 \(k\),得 \(\gcd((y - x)k, yk) = k\),而 \(\gcd((y - x)k, yk) = \gcd(i, d) = 1\),所以 \(k = 1\),即 \(\gcd(d, i - d) = 1\)。

故 \(\sum\limits_{i = 1}^d i[\gcd(i, d) = 1] = \dfrac{\varphi(d) \times d}2\)。

特别地,\(d = 1\) 时,不存在满足上述条件的 \((i, d - i)\),此时 \(\sum\limits_{i = 1}^d i[\gcd(i, d) = 1] = 1\),直接累加进答案即可。

最后:

令 \(f(d) = \left\{ \begin{aligned} 1&, d = 1 \\ \frac{\varphi(d)}{2} \times d&, otherwise. \end{aligned} \right.\),则有:

\[ans = n \sum_{d | n} f(d) \]

时间复杂度 \(O(n + T \sqrt n)\)。

代码:

#include <bits/stdc++.h>

#define MAXN 1000100

using namespace std;

typedef long long ll;

int T, n, phi[MAXN];
int cnt, prime[MAXN];
bool vis[MAXN];

template<typename _T>
void read(_T &_x) {
    _x = 0;
    _T _f = 1;
    char _ch = getchar();
    while (_ch < '0' || '9' < _ch) {
        if (_ch == '-') _f = -1;
        _ch = getchar();
    }
    while ('0' <= _ch && _ch <= '9') {
        _x = (_x << 3) + (_x << 1) + (_ch & 15);
        _ch = getchar();
    }
    _x *= _f;
}

template<typename _T>
void write(_T _x) {
    if (_x < 0) {
        putchar('-');
        _x = -_x;
    }
    if (_x > 9) write(_x / 10);
    putchar('0' + _x % 10);
}

void getphi(int n) {
    phi[1] = 1;
    for (int i = 2; i <= n; i++) {
        if (!vis[i]) {
            phi[i] = i - 1;
            prime[++cnt] = i;
        }
        for (int j = 1; j <= cnt && i * prime[j] <= n; j++) {
            vis[i * prime[j]] = 1;
            if (i % prime[j] == 0) {
                phi[i * prime[j]] = phi[i] * prime[j];
                break;
            }
            phi[i * prime[j]] = phi[i] * phi[prime[j]];
        }
    }
}

ll f(int d) {
    if (d == 1) return 1;
    return (1ll * d * phi[d]) >> 1;
}

int main() {
    getphi(1e6);
    read(T);
    while (T--) {
        read(n);
        ll ans = 0;
        for (int i = 1; i * i <= n; i++) {
            if (n % i) continue;
            ans += f(i);
            if (i * i == n) break;
            ans += f(n / i);
        }
        write(ans * n), putchar('\n');
    }
    return 0;
}

标签:ch,洛谷,gcd,int,nd,sum,P1891,frac,LCM
From: https://www.cnblogs.com/chy12321/p/16941788.html

相关文章

  • 洛谷 P4552 [Poetize6] IncDec Sequence(差分)
    题目分析直接贴一个洛谷上的题解,真的秀,讲的又清楚又好要使得序列的数全部相等,其实就是让他们之间的差全为0,也就是差分序列的除了第一项每一项都是0,为什么除了第一项呢,因......
  • 洛谷 P1387 最大正方形(前缀和,二分)
    题目分析当一个边长为x的正方形不包含0时,这个正方形内的二维前缀和为x*x,题目想求满足条件的最大的正方形的边长假如最大的正方形的边长为ans,那么凡是边长大于ans的正方形......
  • 洛谷 P1205 [USACO1.2] 方块转换 Transformations
    [USACO1.2]方块转换Transformations题目描述一块\(n\timesn\)正方形的黑白瓦片的图案要被转换成新的正方形图案。写一个程序来找出将原始图案按照以下列转换方法转......
  • 洛谷-P5541 Sleepy Cow Herding S
    SleepyCowHerdingSSleepyCowSorting的升级版,从\(3\)头牛变成\(n\)的情况分类讨论+双指针先把答案本就连续的特判丢掉最大值最大值就尽量把每个空位......
  • 如何用潜类别混合效应模型(Latent Class Mixed Model ,LCMM)分析老年痴呆年龄数据|附
    全文下载链接:http://tecdat.cn/?p=24647线性混合模型假设N个受试者的群体是同质的,并且在群体水平上由独特的曲线Xi(t)β描述。最近我们被客户要求撰写关于线性混合......
  • SPOJLCMSUM - LCM Sum
    简要题意\(T\)组数据,每组数据给出一个\(n\),计算:\[\sum_{i=1}^{n}{\operatorname{lcm}(i,n)}\]\(1\leqT\leq3\times10^5,1\leqn\leq10^{6}\)思路比较快乐的......
  • 洛谷P2014 [CTSC1997] 选课
    sloj P2006.「树上背包」选课题目描述在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总......
  • 洛谷P2015 二叉苹果树
    slojP10153.「一本通5.2例1」二叉苹果树P2015二叉苹果树题目描述有一棵苹果树,如果树枝有分叉,一定是分二叉(就是说没有只有一个儿子的结点)这棵树共有N个结点(叶子......
  • 洛谷 P4018 Roy&October之取石子
    洛谷P4018Roy&October之取石子题意:\(n\)个石头,每次取\(p^k\)个石子(\(p\)是质数,\(k\in\N\)),取完最后一个的人获胜,问谁有必胜策略。只能说,MO题真的猛!结论:\(n\bmod......
  • 洛谷P1090 Java
    [NOIP2004提高组]合并果子/[USACO06NOV]FenceRepairG题目描述在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的......