首页 > 其他分享 >P1829 / SP8099 Crash的数字表格 题解

P1829 / SP8099 Crash的数字表格 题解

时间:2024-03-14 17:24:28浏览次数:17  
标签:dfrac Crash limits 题解 ll mu text SP8099 sum

P1829 / SP8099 Crash的数字表格 题解

莫比乌斯反演、数论分块、杜教筛

题目传送门

题意简述

求以下式子的值,对 \(20101009\)(一个质数)取模:

\[\sum\limits_{i=1}^n \sum\limits_{j=1}^m \operatorname{lcm}(i,j) \]

\(n,m \le 10^7\)。加强:\(n,m \le 10^{10}\)。

解法

莫比乌斯反演

设 \(s_1(n) = \sum\limits_{i=1}^n i = \dfrac {n (n+1)} 2\),\(s_2(n) = \sum\limits_{i=1}^n i^2 = \dfrac {n (n+1) (2n+1)} 6\)。

则答案可以通过莫比乌斯反演得到(这一段可以看其他题解),为:

\[\sum\limits_{T=1}^n s_1\left(\left\lfloor \dfrac n T \right\rfloor\right) \times s_1\left(\left\lfloor \dfrac m T \right\rfloor\right) \times T \times \sum\limits_{t|T} \mu(t)t \]

直接做可以 \(O(n \log \log n)\) 或者 \(O(n)\),但我们显然是不满意的。

杜教筛

两个下取整除法可以数论分块(瓶颈显然不在这),所以现在问题变为求 \(f(T) = T \times \sum\limits_{t|T} \mu(t)t\) 的前缀和。

\[f(T) = \sum\limits_{t|T} \mu(t)t^2 \times \dfrac T t \]

设函数 \(\text{Id}(n) = n\),\(\text{Id}_2(n) = n^2\)。

\[f = (\mu \cdot \text{Id}_2) * \text{Id} \]

观察其贝尔级数:

\[f_p(x) = \dfrac{1 - p^2 x} {1 - px} \]

不难发现:

\[\dfrac{1 - p^2 x} {1 - px} \times \dfrac 1 {1 - p^2 x} = \dfrac 1 {1 - p x} \]

\[f * \text{Id}_2 = \text{Id} \]

杜教筛即可。时间复杂度 \(O(n^{\frac 2 3})\)。

代码

代码是 Luogu P1829 次优解(截止至 2024/3/1),注意提交到 SP8099 需要将语言改为 C++98(当然 auto 之类的也要一起改掉)。

#include <bits/stdc++.h>
#define umap unordered_map
using namespace std;
typedef long long ll;

const ll MOD = 20101009;
const ll inv2 = 10050505;
const ll inv6 = 16750841;
const ll CBRT2 = 46415 + 100;
const ll MAXN2 = CBRT2 + 100;

ll s1(ll x) {
    return x * (x + 1) % MOD * inv2 % MOD;
}
ll s2(ll x) {
    return x * (x + 1) % MOD * (2 * x + 1) % MOD * inv6 % MOD;
}

ll n, m;

bool vis[MAXN2];
vector<ll> primes;
ll mu[MAXN2];
ll f[MAXN2], sum[MAXN2];
void sieve(ll n) {
    vis[1] = 1;
    mu[1] = 1;
    f[1] = 1;
    for (ll i = 2; i <= n; i++) {
        if (!vis[i]) {
            primes.push_back(i);
            mu[i] = -1;
            f[i] = i - i * i;
        }
        for (auto j : primes) {
            ll k = i * j; if (k > n) break;
            vis[k] = 1;
            if (i % j == 0) {
                mu[k] = 0;
                f[k] = f[i] * j;
                break;
            }
            mu[k] = mu[i] * mu[j];
            f[k] = f[i] * f[j];
        }
    }
    for (ll i = 1; i <= n; i++)
        sum[i] = (sum[i-1] + f[i]) % MOD;
}
umap<ll, ll> s;
ll S(ll x) {
    if (x <= CBRT2)
        return sum[x];
    if (s.count(x))
        return s[x];
    ll ans = s1(x);
    for (ll l = 2, r; l <= x; l = r + 1) {
        ll v = x / l;
        r = x / v;
        ans -= (s2(r) - s2(l-1)) * S(v) % MOD;
    }
    (ans += MOD) %= MOD;
    return s[x] = ans;
}
ll solve(ll n, ll m) {
    ll ans = 0;
    for (ll l = 1, r; l <= n; l = r + 1) {
        ll v1 = n / l, v2 = m / l;
        r = min(n / v1, m / v2);
        (ans += s1(v1) * s1(v2) % MOD * (S(r) - S(l-1) + MOD) % MOD) %= MOD;
    }
    return ans;
}

int main() {
    cin >> n >> m;
    if (n > m) swap(n, m);
    sieve(min(n, CBRT2));
    cout << solve(n, m) << '\n';
    return 0;
}

标签:dfrac,Crash,limits,题解,ll,mu,text,SP8099,sum
From: https://www.cnblogs.com/AugustLight/p/18073341

相关文章

  • 2024-03 STEMA 考试C++ 中级真题解析
    2024-03-10STEMA考试C++中级真题解析一、选择题(50分)1、    (110010)2+(c3)16的结果是(B )。A.(240)10        B.(11110101)2        C.(366)8        D.(f6)16备注:此题目下标代表进制,因不支持md格式。  2、   表达式1000/3的结果是(......
  • 服务平滑迁移:eureka迁移到nacos。无法注册双中心的问题解决
    迁移的文档:https://www.alibabacloud.com/help/zh/edas/developer-reference/smoothly-migrate-a-spring-cloud-cluster-that-contains-multiple-applications-to-edas其中遇到的问题未配置排除配置项时(exclude={RibbonEurekaAutoConfiguration.class}),ribbonServerList不是......
  • Codeforces Round 933 (Div. 3) A - G 题解
    CodeforcesRound933(Div.3)A-RudolfandtheTicketSolution因为\(n\)很小,直接枚举\(b_i+c_j\)所产生的所有数字Code#include<bits/stdc++.h>usingnamespacestd;voidsolve(){intn,m,k;cin>>n>>m>>k;intans=0;......
  • thinkphp 5 跨域问题解决
    版本:5.1.41LTS从网上搜到好多从/public/index.php添加heade信息,或者用中间件,或者添加behavior操作,可以做到解决跨域问题,但是亲身试验了都不行,今天刚找了一个,可以使用,放在这里header('Access-Control-Allow-Credentials:true');header('Access-Control-Allow-Methods:GET,......
  • openGauss 由于RemoveIPC未关闭导致数据库crash
    openGauss由于RemoveIPC未关闭导致数据库crashsemop引发的数据库crash--主库FATAL:semop(id=xxxxx)failed:IdentifierremovedFATAL:semctl(xxxxxx,11,SETVAL,0)failed:Invalidargument--备库FATAL:semctl(xxxxxx,11,SETVAL,0)failed:InvalidargumentLOG......
  • 常见问题解决 --- vmware地址分配失败
    vmware是根据分配给客户机的ip决定它处于什么网路。这句话非常抽象,我举例说明,vmware默认有三张网卡,一个桥接网卡,一个nat网卡,一个仅主机。我先说第一中情况 如果里配置客户机是桥接网卡,且在配置器中选择自动桥接。如果里宿主机有一张网卡,那么就桥接那一张网卡。并获取网路内的d......
  • Edu 12 --- Simple Subset -- 题解 (一个比较巧妙的思维算法题)
    SimpleSubset:题解:  思路解析:    题目要求任意两个数的和为质数,那我们最坏情况就是任意选择一个数,此时子集为最大。    如果子集中有两个奇数或者偶数,他们两个之和一定会被2整除,那么我们只能选择一奇一偶。    如果多个奇数都为1的话,他们两两......
  • 【NOIP2013模拟联考8】匹配(match) 题解
    B组都说看不懂……我也解释不清啊……只能写这么详细了ac自动机ac自动机上dp怎么才能判定一个母串是否包含几个模式串?我们可以想到ac自动机,考虑对模式串建ac自动机,如果我们跑到了一个标记为tail的节点,说明我们的母串包含了这一个模式串。所以我们设\(f[i][s][......
  • LeetCode[题解] 2864. 最大二进制奇数
    题目给你一个二进制字符串s,其中至少包含一个'1'。你必须按某种方式重新排列字符串中的位,使得到的二进制数字是可以由该组合生成的最大二进制奇数。以字符串形式,表示并返回可以由给定组合生成的最大二进制奇数。注意返回的结果字符串可以含前导零。示例1:输入:s......
  • 2024.03.13 题解
    CF566A.MatchingNames注意到要求公共前缀,所以先对所有字符串建出Trie树,则公共前缀长度等价于Trie树上两节点最近公共祖先的深度。设\(dfn_u\)表示u点的dfs序,\(dep_u\)表示u的深度,\(lca_{u,v}\)表示\(u\)和\(v\)的最近公共祖先。则对于\(dfn_a<dfn_b<d......