「洛谷P3768」简单的数学题

题目链接

简单的数学题

题目描述

输入一个整数n和一个整数p,你需要求出
\[\sum_{i=1}^n\sum_{j=1}^n (i\cdot j\cdot gcd(i,j))\ mod\ p\]?
其中\(gcd(a,b)\)表示\(a\)与\(b\)的最大公约数

输入

一行两个整数\(p,n\)

输出

一行一个整数,为题目中所求值

样例

样例输入

998244353 2000

样例输出

883968974

数据范围

\(n\leq 10^{10}\)
\(5\times 10^8 \leq p \leq 1.1\times 10^9?\)
\(p?\)为质数(但貌似也可以不是?又不用求逆元)

题解

自己想出来的题!但是连\(WA\)两发就是因为杜教筛写挂了……
先不考虑取余,我们化一下题目中的式子,枚举\(gcd\)(警告!多公式)。
\[\sum_{i=1}^n\sum_{j=1}^n i\cdot j\cdot gcd(i,j)\]?
\[\sum_{d=1}^{n}d\sum_{i=1}^{\left\lfloor \frac{n}{d}\right\rfloor}\sum_{j=1}^{\left\lfloor \frac{n}{d}\right\rfloor}[i\perp j]i\cdot j \cdot d^2\]
\[\sum_{d=1}^{n}d^3\sum_{i=1}^{\left \lfloor \frac{n}{d}\right\rfloor}\sum_{j=1}^{\left\lfloor \frac{n}{d}\right\rfloor}[i\perp j]i\cdot j\]
\[\sum_{d=1}^{n}d^3\sum_{p=1}^{n}\mu(p)p^2\cdot \Big(\frac{(1+\left\lfloor \frac{n}{dp}\right\rfloor)\left\lfloor \frac{n}{dp}\right\rfloor}{2}\Big)^2\]

额,现在可以使用分块优化做到\(O(n)?\)了,但是这完全不能胜任数据范围,我们换个角度,设\(dp=T?\),枚举T会有什么结果?

\[\sum_{T=1}^{n}\Big(\frac{(1+\left\lfloor \frac{n}{T}\right\rfloor)\left\lfloor \frac{n}{T}\right\rfloor}{2}\Big)^2\sum_{d|T}d^3\cdot \mu(\frac{T}{d})(\frac{T}{d})^2\]

\[\sum_{T=1}^{n}\Big(\frac{(1+\left\lfloor \frac{n}{T}\right\rfloor)\left\lfloor \frac{n}{T}\right\rfloor}{2}\Big)^2 T^2\sum_{d|T}d\cdot \mu(\frac{T}{d})\]

现在好像反而变成\(O(n\log n)\)或\(O(n\sqrt{n})\)了,别急,我们看看第二层的求和的意义——狄利克雷卷积,这是\(Id\)函数与\(\mu\)函数的狄利克雷卷积,其值就等于\(\varphi\)。

\[\sum_{T=1}^{n}\Big(\frac{(1+\left\lfloor \frac{n}{T}\right\rfloor)\left\lfloor \frac{n}{T}\right\rfloor}{2}\Big)^2 T^2\varphi(T)\]

现在,我们只需要快速求出一个东西即可——\(T^2\varphi(T)\),前面的部分可以分块优化,我们急需解决的就是这个函数\(f(T)=T^2\varphi(T)\)的前缀和\(F(T)\)。显然,这是一个积性函数。

杜教筛的公式:
\[\sum_{i=1}^{n}(f*g)(i)=\sum_{i=1}^{n}\sum_{d|i}f(d)\cdot g(\frac{i}{d})=\sum_{i=1}^{n}g(i)\sum_{j=1}^{\left\lfloor \frac{n}{i}\right\rfloor}f(j)\]

于是我们需要一个函数与\(f\)卷起来,我们根据套路或枚举发现\(T^2\)项很恼人,于是尝试把这一项消掉,于是想到了\(g(x)=x^2\)。

\[\sum_{i=1}^{n}\sum_{d|i}d^2\varphi(d)\cdot (\frac{i}{d})^2=\sum_{i=1}^{n}i^2\sum_{j=1}^{\left\lfloor \frac{n}{i}\right\rfloor}f(j)\]
\[\sum_{i=1}^{n}i^2\sum_{d|i}\varphi(d)=\sum_{i=1}^{n}i^2F(\left\lfloor \frac{n}{i}\right\rfloor)?\]

根据公式\(\sum_{d|i}\varphi(d)=i\),继续变形

\[\sum_{i=1}^{n}i^3=F(n)+\sum_{i=2}^{n}i^2F(\left\lfloor \frac{n}{i}\right\rfloor)\]
\[F(n)=\sum_{i=1}^{n}i^3-\sum_{i=2}^{n}i^2F(\left\lfloor \frac{n}{i}\right\rfloor)\]

由于\(p(i)=i^3\)和\(q(i)=i^2\)的前缀和都有公式,我们可以对右边进行分块优化,就可以杜教筛了!这道题圆满解决,时间复杂度\(O(n^{\frac{2}{3}})\)。

不过有些小细节要注意,比如模数乘\(2\)可能会爆\(int\),\(n^2\)可能会爆\(long\ long\),需要先取模再平方

\(Code:\)

#include <map>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define N 5000005
#define ll long long
map<ll, ll>Phi;
ll n, mod, g[N];
int p[N], h[N], phi[N], cnt;
ll sqr(ll x)
{
    ll a = 2 * x + 1, b = x + 1, c = x;
    if (b % 2 == 0)b /= 2;
    else c /= 2;
    if (a % 3 == 0)a /= 3;
    else
        if (b % 3 == 0)b /= 3;
        else c /= 3;
    a %= mod, b %= mod, c %= mod;
    return a * b % mod * c % mod;
}
ll seq(ll x)
{
    ll a = x + 1, b = x;
    if (a % 2 == 0)a /= 2;
    else b /= 2;
    a %= mod, b %= mod;
    return a * b % mod;
}
ll vas(ll x)
{
    ll a = seq(x);
    return a * a % mod;
}
ll G(ll x)
{
    if (x <= N - 5)
        return g[int(x)];
    if (Phi.find(x) != Phi.end())
        return Phi[x];
    ll ans = vas(x);
    ll lst = 1;
    for (ll i = 2; i <= x; i++)
    {
        i = x / (x / i);
        ll w = (sqr(i) - sqr(lst)) % mod;
        ans = (ans - w * G(x / i) % mod) % mod;
        lst = i;
    }
    if (ans < 0)
        ans += mod;
    Phi.insert(make_pair(x, ans));
    return ans;
}
ll Ans(ll x)
{
    ll ans = 0, lst = 0;
    for (ll i = 1; i <= x; i++)
    {
        i = x / (x / i);
        ll z = seq(x / i);
        z = z * z % mod;
        ans = (ans + z * (G(i) - G(lst)) % mod) % mod;
        lst = i;
    }
    if (ans < 0)
        ans += mod;
    return ans;
}
int main()
{
    phi[1] = 1;
    for (int i = 2; i <= N - 5; i++)
    {
        if (!h[i])
        {
            phi[i] = i - 1;
            p[++cnt] = i;
        }
        for (int j = 1; j <= cnt; j++)
        {
            if (i * p[j] > N - 5)
                break;
            h[i * p[j]] = 1;
            if (i % p[j] == 0)
                phi[i * p[j]] = phi[i] * p[j];
            else
                phi[i * p[j]] = phi[i] * (p[j] - 1);
        }
    }
    cin >> mod >> n;
    for (int i = 1; i <= N - 5; i++)
        g[i] = (g[i - 1] + 1ll * phi[i] * i % mod * i % mod) % mod;
    cout << Ans(n) << '\n';
}

原文地址:https://www.cnblogs.com/ModestStarlight/p/8732392.html

时间: 2024-10-16 05:10:01

「洛谷P3768」简单的数学题的相关文章

洛谷3768:简单的数学题——题解

https://www.luogu.org/problemnew/show/P3768 题面来自洛谷,因为没用markdown所以直接截的图. 剩余的图是我用markdown写完然后截的图. 参考洛谷第一篇题解. 这个式子直观感受就需要莫比乌斯反演,大致的过程参考:BZOJ2693:jzptab 那么跳过暴力推式子,我们能够得到: (如果你疑问为什么是miu(k/d)而不是miu(d),其实二者皆可,但是为什么这么干请往下看) 显然可以分块O(sqrt(n))做,那么后面的那一串东西怎么做呢?

P3768 【简单的数学题】

P3768 [简单的数学题] \(Ans=\sum ^{n}_{i=1}\sum ^{n}_{j=1}ijgcd(i,j)\) \(=\sum ^{n}_{i=1}\sum ^{n}_{j=1}ij\sum _{k|i,k|j} φ(k)\) \(=\sum ^{n}_{k=1} φ(k) \sum _{k|i}\sum _{k|j}ij\) \(=\sum ^{n}_{k=1}\varphi (k) k^{2} (\sum ^{n/k}_{i=1}i)^{2}\) \(=\sum ^{n}_{

洛谷-小书童——密码-简单字符串

题目背景 Background 某蒟蒻迷上了“小书童”,有一天登陆时忘记密码了(他没绑定邮箱or手机),于是便把问题抛给了神犇你. 题目描述 Description 蒟蒻虽然忘记密码,但他还记得密码是由一串字母组成.且密码是由一串字母每个向后移动n为形成.他现在找到了移动前的那串字母及n,请你求出密码. 输入输出格式 Input/output 输入格式:第一行:n.第二行:未移动前的一串字母输出格式:一行,是此蒟蒻的密码 输入输出样例 Sample input/output 样例测试点#1 输入

洛谷-ISBN号码-简单字符串

题目描述 Description 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字.1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”就是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码.ISBN码的首位数字表示书籍的出版语言,例如0代表英语:第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社:第二个分隔符后的五位数字代表该书在该出版社的编号:最后一位为识别码.识别码的计算方

洛谷P1247 取火柴游戏 数学题 博弈论

这题就是NIM取石子游戏,但是NIM取石子方案并不是单一的,而是有多种方案的,现在让我们求字典序最小的方案,其实还是简单的,作为先手,如果是必胜局面,那我们肯定第一步把所有子异或和变为零 ,这样对于对方,这就是一个必败局面了 2.那我们来考虑怎么把局面变成必败局面呢,换句话说,怎么判断这一堆取不取呢, 假设a[ i ]不取他们的异或值为 y ,那么如果我们把a[ i ]变成 y 那么 y^y=0 就必胜了那就只要判断 if a[ i ]>=y 就可知在这一位上改变可不可行了,要字典序最小那就i从

「10.13晚」简单的序列(DP)&#183;简单的期望(DP)&#183;简单的操作(二分图+最短路)

A. 简单的序列 一道$DP$题,容易想到卡特兰数 考虑$n-m$的范围很小,显然我们可以将他们拼起来, 怎么拼???? 然后我们可以枚举在$s$左侧放了多少个括号 假如我们将左括号看成$+1$,右括号看成$-1$,两边保证前缀大于$0$,且后缀小于$0$, 然后注意给出的$s$序列化简之后的情况,于是就愉快的获得$100$的好成绩 我会告诉你我$T1$打了快两个小时才$A$掉吗? B. 简单的期望 神仙DP. 考场完全没想到,事实是因为根本没想.... 考虑分解的二的个数,其实就是该数在二进制

洛谷-垂直柱状图-简单字符串

题目描述 Description 写一个程序从输入文件中去读取四行大写字母(全都是大写的,每行不超过72个字符),然后用柱状图输出每个字符在输入文件中出现的次数.严格地按照输出样例来安排你的输出格式. 输入输出格式 Input/output 输入格式:四行字符,由大写字母组成,每行不超过72个字符输出格式:由若干行组成,前几行由空格和星号组成,最后一行则是由空格和字母组成的.在任何一行末尾不要打印不需要的多余空格.不要打印任何空行. 输入输出样例 Sample input/output 样例测试

洛谷P4593 [TJOI2018]教科书般的亵渎 【数学】

题目链接 洛谷P4593 题解 这种神仙数学题我当然不会做.. orz dalao 不过推导倒是挺简单 由题我们只需模拟出代价,只需使用\(S(n,k) = \sum\limits_{i = 1}^{n} i^{k}\)这样的前缀和计算 我不知道怎么来的这样一个公式[如果有那位dalao知道欢迎留言]: \[(n + 1)^{k + 1} - n^{k + 1} = \sum\limits_{i = 1}^{k + 1} {k + 1\choose i}n^{k + 1 - i}\] 我们发现这

【Luogu3768】简单的数学题(莫比乌斯反演,杜教筛)

[Luogu3768]简单的数学题(莫比乌斯反演,杜教筛) 题面 洛谷 \[求\sum_{i=1}^n\sum_{j=1}^nijgcd(i,j)\] $ n<=10^9$ 题解 很明显的把\(gcd\)提出来 \[\sum_{d=1}^nd\sum_{i=1}^n\sum_{j=1}^nij[gcd(i,j)==d]\] 习惯性的提出来 \[\sum_{d=1}^nd^3\sum_{i=1}^{n/d}\sum_{j=1}^{n/d}ij[gcd(i,j)==1]\] 后面这玩意很明显的来一发