【LG3768】简单的数学题

【LG3768】简单的数学题

题面


\[ (\sum_{i=1}^n\sum_{j=1}^nij\text{gcd}(i,j))\text{mod}p \]

其中\(n\leq 10^{10},5\times 10^8\leq p \leq 1.1*10^9\)

题解

推柿子:

\[ \sum_{i=1}^n\sum_{j=1}^nij\text{gcd}(i,j)\\ =\sum_{d=1}d\sum_{i=1}^{\lfloor\frac nd\rfloor}\sum_{j=1}^{\lfloor\frac nd\rfloor}ijd^2[\gcd(i,j)==1]\\ =\sum_{d=1}d^3\sum_{i=1}^{\lfloor\frac nd\rfloor}\sum_{j=1}^{\lfloor\frac nd\rfloor}ij[\gcd(i,j)==1]\\ \]

\[ f(d')=\sum_{i=1}^{n'}\sum_{j=1}^{n'}ij[\gcd(i,j)==d']\\ g(d')=\sum_{d'\mid x}f(x) \]

\[ g(d')=\sum_{d'\mid x}\sum_{i=1}^{n'}\sum_{j=1}^{n'}ij[\gcd(i,j)==x]\\ =\sum_{i=1}^{n'}\sum_{j=1}^{n'}ij[d'|\gcd(i,j)]\\ =\sum_{i=1}^{\lfloor\frac {n'}{d'}\rfloor}\sum_{j=1}^{\lfloor\frac {n'}{d'}\rfloor}ijd'^2[1|\gcd(i,j)]\\ =S(\lfloor\frac {n'}{d'}\rfloor)^2d'^2 \]

其中\(S(x)=\sum_{i=1}^x i\)

那么

\[ f(d')=\sum_{d'\mid x}S(\lfloor\frac {n'}x\rfloor)^2x^2\mu (x)\\ f(1)=\sum_{x=1}^{n'}S(\lfloor\frac {n'}x\rfloor)^2x^2\mu (x) \]

代回去

\[ \sum_{d=1}^nd^3\sum_{x=1}^{\lfloor\frac nd\rfloor}S(\lfloor\frac {n}{xd}\rfloor)^2x^2\mu (x) \]

\(Q=xd\)

\[ \sum_{d=1}^nd^3\sum_{x=1}^{\lfloor\frac nd\rfloor}S(\lfloor\frac {n}{Q}\rfloor)^2x^2\mu (x)\\ =\sum_{Q=1}^nS(\lfloor\frac {n}{Q}\rfloor)\sum_{d\mid Q}d^3(\frac Qd)^2\mu (\frac Qd)\\ =\sum_{Q=1}^nS(\lfloor\frac {n}{Q}\rfloor)^2\sum_{d\mid Q}dQ^2\mu (\frac Qd)\\ =\sum_{Q=1}^nS(\lfloor\frac {n}{Q}\rfloor)^2Q^2\varphi (Q) \]

现在我们如何求\(Q^2\varphi (Q)\)的前缀和呢?

\(f=\text{id}^{2}\cdot \varphi\),令\(g=\text{id}^2\cdot 1\)

那么\(f*g=\text{id}^3,g=\text{id}^2\)

就做完了。

#include <iostream> 
#include <cstdio> 
#include <cstdlib> 
#include <cstring> 
#include <cmath> 
#include <algorithm>
#include <map> 
using namespace std; 
const int MAX = 1e7, MAX_N = 1e7 + 5; 
bool nprime[MAX_N]; 
int prime[MAX_N], cnt, phi[MAX_N], f[MAX_N];
long long N; 
int Mod; 
int fpow(int x, int y) { 
    int res = 1;
    while (y) {
        if (y & 1) res = 1ll * res * x % Mod; 
        x = 1ll * x * x % Mod;
        y >>= 1; 
    } 
    return res; 
} 
void sieve() { 
    phi[1] = 1; 
    for (int i = 2; i <= MAX; i++) { 
        if (!nprime[i]) prime[++cnt] = i, phi[i] = i - 1; 
        for (int j = 1; j <= cnt && prime[j] * i <= MAX; j++) { 
            nprime[prime[j] * i] = 1; 
            if (i % prime[j] == 0) { phi[i * prime[j]] = 1ll * phi[i] * prime[j] % Mod; break; } 
            phi[i * prime[j]] = 1ll * phi[i] * phi[prime[j]] % Mod; 
        } 
    } 
    for (int i = 1; i <= MAX; i++) f[i] = (f[i - 1] + 1ll * phi[i] * i % Mod * i % Mod) % Mod; 
}
int inv2, inv6; 
int sqr(int n) { return 1ll * n * n % Mod; } 
int S(long long n) { return n %= Mod, n % Mod * (n + 1) % Mod * inv2 % Mod; } 
int g(long long n) { return n %= Mod, n % Mod * (n + 1) % Mod * (2 * n + 1) % Mod * inv6 % Mod; } 
map<long long, int> mp; 
int get_f(long long n) { 
    if (n <= MAX) return f[n]; 
    if (mp.find(n) != mp.end()) return mp[n]; 
    int res = sqr(S(n)); 
    for (long long l = 2, r; l <= n; l = r + 1) { 
        r = n / (n / l);
        res = (res - 1ll * (g(r) - g(l - 1) + Mod) % Mod * get_f(n / l) % Mod + Mod) % Mod; 
    } 
    return mp[n] = res; 
} 
int main () { 
#ifndef ONLINE_JUDGE 
    freopen("cpp.in", "r", stdin); 
#endif 
    cin >> Mod >> N; 
    sieve(); 
    inv2 = fpow(2, Mod - 2), inv6 = fpow(6, Mod - 2); 
    int ans = 0; 
    for (long long l = 1, r; l <= N; l = r + 1) { 
        r = N / (N / l); 
        ans = (ans + 1ll * sqr(S(N / l)) * ((get_f(r) - get_f(l - 1) + Mod) % Mod) % Mod) % Mod; 
    }
    printf("%d\n", ans); 
    return 0; 
} 

转载于:https://www.cnblogs.com/heyujun/p/10623894.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值