[Luogu 3768]简单的数学题
Description
输入一个整数n和一个整数p,你需要求出$(\sum_{i=1}^n\sum_{j=1}^n ijgcd(i,j))~mod~p$,其中gcd(a,b)表示a与b的最大公约数。
Input
一行两个整数p、n。
Output
一行一个整数$(\sum_{i=1}^n\sum_{j=1}^n ijgcd(i,j))~mod~p$。
Sample Input
998244353 2000
Sample Output
883968974
HINT
对于20%的数据,$n \leq 1000$。
对于30%的数据,$n \leq 5000$。
对于60%的数据,$n \leq 10^6$,时限1s。
对于另外20%的数据,$n \leq 10^9$,时限3s。
对于最后20%的数据,$n \leq 10^{10}$,时限6s。
对于100%的数据,$5 \times 10^8 \leq p \leq 1.1 \times 10^9$且p为质数。
题解
题目要求 $$\sum_{i=1}^n\sum_{j=1}^n ij\cdot gcd(i,j)$$
提出 $gcd$ \begin{aligned}&\sum_{d=1}^nd\sum_{i=1}^{n}\sum_{j=1}^nij[gcd(i,j)=d]\\=&\sum_{d=1}^nd^3\sum_{i=1}^{\left\lfloor\frac{n}{d}\right\rfloor}\sum_{j=1}^{\left\lfloor\frac{n}{d}\right\rfloor}ij[gcd(i,j)=1]\\=&\sum_{d=1}^nd^3\sum_{i=1}^{\left\lfloor\frac{n}{d}\right\rfloor}\sum_{j=1}^{\left\lfloor\frac{n}{d}\right\rfloor}ij\sum_{k\mid gcd(i,j)}\mu(k)\\=&\sum_{d=1}^nd^3\sum_{k=1}^{\left\lfloor\frac{n}{d}\right\rfloor}\mu(k)k^2\sum_{i=1}^{\left\lfloor\frac{n}{kd}\right\rfloor}\sum_{j=1}^{\left\lfloor\frac{n}{kd}\right\rfloor}ij\end{aligned}
令 $F(x)=\sum\limits_{i=1}^xi=\frac{x(x+1)}{2}$ , $T=kd$ \begin{aligned}\Rightarrow&\sum_{d=1}^nd^3\sum_{k=1}^{\left\lfloor\frac{n}{d}\right\rfloor}\mu(k)k^2F^2\left(\frac{n}{kd}\right)\\=&\sum_{T=1}^nF^2\left(\frac{n}{T}\right)\sum_{d\mid T}d^3\left(\frac{T}{d}\right)^2\mu\left(\frac{T}{d}\right)\\=&\sum_{T=1}^nF^2\left(\frac{n}{T}\right)T^2\sum_{d\mid T}d\cdot\mu\left(\frac{T}{d}\right)\end{aligned}
前面的很好处理,但那个狄利克雷卷积是什么鬼...我们把它拎出来调教一下: $$\sum_{d\mid T}d\cdot\mu\left(\frac{T}{d}\right)$$
这个形式似乎不好看,我们让它女装变个样子: $$\sum_{d\mid T}\frac{T}{d}\cdot\mu(d)=T\sum_{d\mid T}\frac{\mu(d)}{d}$$
这玩意不就是 $\varphi(T)$ 么。带入原柿 $$\sum_{T=1}^nF^2\left(\frac{n}{T}\right)T^2\varphi(T)$$
现在就好搞♂了,美滋滋。记 $f(T)=T^2\varphi(T)$ 显然他是个积性函数,可以杜教筛了。
考虑求 $S(n)=\sum\limits_{i=1}^nf(i)$
上述式子 $$g(1)S(n)=\sum_{i=1}^n(g*f)(i)-\sum_{i=2}^ng(i)S\left(\left\lfloor\frac{n}{i}\right\rfloor\right)$$
考虑到 $\sum\limits_{d\mid n}\varphi(d)=n$ ,又由于 $(g*f)(n)=\sum\limits_{d\mid n}\varphi(d)d^2\cdot g\left(\frac{n}{d}\right)$ 。我们考虑让 $g(n)=id^2(n)$ ,那么 $(id*f)(n)=\sum\limits_{d\mid n}n^2\cdot\varphi(d)=n^3$ 。由于 $\sum\limits_{i=1}^ni^3=\frac{n^2(n+1)^2}{4}=\left(\frac{n(n+1)}{2}\right)^2=F^2(n)$ 。显然这个卷积的前缀为 $\sum\limits_{i=1}^n(g*f)(i)=F^2(n)$ 。
故对于 $f$ $$S(n)=F^2(n)-\sum_{i=2}^ni^2\cdot S\left(\left\lfloor\frac{n}{i}\right\rfloor\right)$$
由公式 $\sum\limits_{i=1}^ni^2=\frac{n(n+1)(2n+1)}{6}$ 现在整个柿子都好算了。
//It is made by Awson on 2018.1.25
#include <set>
#include <map>
#include <cmath>
#include <ctime>
#include <queue>
#include <stack>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
#define Abs(a) ((a) < 0 ? (-(a)) : (a))
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define Swap(a, b) ((a) ^= (b), (b) ^= (a), (a) ^= (b))
#define writeln(x) (write(x), putchar('\n'))
#define lowbit(x) ((x)&(-(x)))
using namespace std;
const int N = ;
void read(LL &x) {
char ch; bool flag = ;
for (ch = getchar(); !isdigit(ch) && ((flag |= (ch == '-')) || ); ch = getchar());
for (x = ; isdigit(ch); x = (x<<)+(x<<)+ch-, ch = getchar());
x *= -*flag;
}
void write(LL x) {
if (x > ) write(x/);
putchar(x%+);
} LL n, p, phi[N+], inv2, inv6;
LL prime[N+], isprime[N+], tot;
map<LL,LL>mp; LL quick_pow(LL a, LL b) {
LL ans = ; a %= p;
while (b) {
if (b&) ans = ans*a%p;
a = a*a%p; b >>= ;
}
return ans;
}
void get_pre() {
memset(isprime, , sizeof(isprime)); isprime[] = , phi[] = ;
for (int i = ; i <= N; i++) {
if (isprime[i]) prime[++tot] = i, phi[i] = 1ll*(i-)*i%p*i%p;
for (int j = ; j <= tot && i*prime[j] <= N; j++) {
isprime[i*prime[j]] = ;
if (i%prime[j]) phi[i*prime[j]] = phi[i]*(prime[j]-)%p*prime[j]%p*prime[j]%p;
else {phi[i*prime[j]] = phi[i]*prime[j]%p*prime[j]%p*prime[j]%p; break; }
}
(phi[i] += phi[i-]) %= p;
}
}
LL sum(LL n) {n %= p; return n*(n+)%p*inv2%p; }
LL sum2(LL n) {n %= p; return n*(n+)%p*(n*+)%p*inv6%p; }
LL get_phi(LL n) {
if (n <= N) return phi[n];
if (mp.count(n)) return mp[n];
LL ans = sum(n)*sum(n)%p;
for (LL i = , last; i <= n; i = last+) {
last = n/(n/i); (ans -= get_phi(n/i)*((sum2(last)-sum2(i-))%p)%p) %= p;
}
return mp[n] = ans;
}
void work() {
read(p), read(n); get_pre(); inv2 = quick_pow(, p-), inv6 = quick_pow(, p-); LL ans = ;
for (LL i = , last; i <= n; i = last+) {
last = n/(n/i); LL s = sum(n/i);
(ans += s*s%p*((get_phi(last)-get_phi(i-))%p)%p) %= p;
}
writeln((ans+p)%p);
}
int main() {
work();
return ;
}
[Luogu 3768]简单的数学题的更多相关文章
- luogu 3768 简单的数学题 (莫比乌斯反演+杜教筛)
题目大意:略 洛谷传送门 杜教筛入门题? 以下都是常规套路的变形,不再过多解释 $\sum\limits_{i=1}^{N}\sum\limits_{j=1}^{N}ijgcd(i,j)$ $\sum ...
- Luogu P3768 简单的数学题
非常恶心的一道数学题,推式子推到吐血. 光是\(\gcd\)求和我还是会的,但是多了个\(ij\)是什么鬼东西. \[\sum_{i=1}^n\sum_{j=1}^nij\gcd(i,j)=\sum_ ...
- luogu P3768 简单的数学题 杜教筛 + 欧拉反演 + 逆元
求 $\sum_{i=1}^{n}\sum_{j=1}^{n}ijgcd(i,j)$ 考虑欧拉反演: $\sum_{d|n}\varphi(d)=n$ $\Rightarrow \sum_{i ...
- 【数学】HPU--1037 一个简单的数学题
1037: 一个简单的数学题 [数学] 时间限制: 1 Sec 内存限制: 128 MB提交: 259 解决: 41 统计 题目描述 小明想要知道$a^b$的值,但是这个值会非常的大. 所以退而求其次 ...
- 【Luogu3768】简单的数学题(莫比乌斯反演,杜教筛)
[Luogu3768]简单的数学题(莫比乌斯反演,杜教筛) 题面 洛谷 \[求\sum_{i=1}^n\sum_{j=1}^nijgcd(i,j)\] $ n<=10^9$ 题解 很明显的把\( ...
- 【LG3768】简单的数学题
[LG3768]简单的数学题 题面 求 \[ (\sum_{i=1}^n\sum_{j=1}^nij\text{gcd}(i,j))\text{mod}p \] 其中\(n\leq 10^{10},5 ...
- luoguP3768 简单的数学题
题目链接 luoguP3768 简单的数学题 题解 上面那个式子的最后一步,需要定理 用数学归纳法证明 \(S1=1^3=1^2\) \(S2=1^3+2^3=9=3^2=(1+2)^2\) \(S3 ...
- 洛谷 P3768 简单的数学题 解题报告
P3768 简单的数学题 题目描述 由于出题人懒得写背景了,题目还是简单一点好. 输入一个整数\(n\)和一个整数\(p,\)你需要求出\((\sum_{i=1}^n\sum_{j=1}^n ijgc ...
- loj#6229 这是一道简单的数学题
\(\color{#0066ff}{ 题目描述 }\) 这是一道非常简单的数学题. 最近 LzyRapxLzyRapx 正在看 mathematics for computer science 这本书 ...
随机推荐
- RDD概念、特性、缓存策略与容错
一.RDD概念与特性 1. RDD的概念 RDD(Resilient Distributed Dataset),是指弹性分布式数据集.数据集:Spark中的编程是基于RDD的,将原始数据加载到内存变成 ...
- eoLinker API-Shop 抓住区块链机遇,从这些API开始
区块链是分布式存储.点对点传输.共识机制.加密算法等计算机技术的新型应用模式.所谓共识机制是区块链系统中实现不同节点之间建立信任.获取权益的数学算法. 区块链目前分为三类: 公有区块链(PublicB ...
- Hibernate——配置并访问数据库
Hibernate,对于java来说很重要的一个东西,用于持久层.之前看了很多配置的,都不行,自己来写一个配置成功的. 环境:jdk1.8,eclipse-jee-oxygen,mysql-conne ...
- QT5.8 for embedded
http://doc.qt.io/qt-5/embedded-linux.html 先占座~
- 详谈C++虚函数表那回事(多重继承关系)
上一篇说了一般继承,也就是单继承的虚函数表,接下来说说多重继承的虚函数表: 1.无虚函数覆盖的多重继承: 代码: #pragma once //无覆盖,多重继承 class Base1 { publi ...
- 再议Python协程——从yield到asyncio
协程,英文名Coroutine.前面介绍Python的多线程,以及用多线程实现并发(参见这篇文章[浅析Python多线程]),今天介绍的协程也是常用的并发手段.本篇主要内容包含:协程的基本概念.协程库 ...
- vue jquery js 获取当前时间本周的第一天 和 本月的第一天
交互的时候传输数据 后台要求这样的数据 直接上代码 这是我找度姨要的 附上链接 https://www.cnblogs.com/wasabii/p/7756560.html 它里面有本季度第一天 ...
- 【bug清除】新Surface Pro使用OneNote出现毛刺现象的解决方案
在写字的时候,左手触摸Surface的金属外壳背面,大概两个手指指肚大小.问题亲测可以得到解决. 推测是设备使用时接地没有做好,导致电磁笔出现偏移.问题初步锁定在新笔的倾斜感应上. 参考资料: htt ...
- 爬虫系列(1)-----python爬取猫眼电影top100榜
对于Python初学者来说,爬虫技能是应该是最好入门,也是最能够有让自己有成就感的,今天在整理代码时,整理了一下之前自己学习爬虫的一些代码,今天先上一个简单的例子,手把手教你入门Python爬虫,爬取 ...
- PHP模式设计之单例模式、工厂模式、注册树模式、适配器模式、观察者模式
php模式设计之单例模式 什么是单例模式? 单例模式是指在整个应用中只有一个实例对象的设计模式 为什么要用单例模式? php经常要链接数据库,如果在一个项目中频繁建立连接数据库,会造成服务器资源的很大 ...