[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 这本书 ...
随机推荐
- Win7(64Bit旗舰版) 安装 PL/SQL Developer图解说明
Win7逐渐成为现行主流的windows操作系统,其32和64位系统平分秋色.然而当下还没有64位的PL/SQL Developer问世,直接用32位的PL/SQL Developer连接Win7(6 ...
- C语言-学生博客汇总
一.学生个人博客汇总 五班 学号 姓名 博客地址 4079 马天琦 http://www.cnblogs.com/simalang/ 4080 马宇欣 http://www.cnblogs.com/m ...
- 20145237 《Java程序设计》第4周学习总结
20145237 <Java程序设计>第4周学习总结 教材学习内容总结 一. 继承 . 定义:面向对象中,涉及对象过多时容易出现重复行为,为了避免这种情况,就可把重复的部分写成父类,由子 ...
- DistBlockNet:A Distributed Blockchains-Based Secure SDN Architecture for IOT Network
现有问题 随着IOT中智能设备多样性和数目的增加,IOT的灵活性,效率,可用性,安全性和可扩展性的问题越来越明显. 实验目标 按照高适应性,可用性,容错性,性能,可靠性,可扩展性和安全性的设计原则,构 ...
- 几种Java的JSON解析库速度对比
java中哪个JSON库的解析速度是最快的? JSON已经成为当前服务器与WEB应用之间数据传输的公认标准,不过正如许多我们所习以为常的事情一样,你会觉得这是理所当然的便不再深入思考 了.我们很少会去 ...
- IT学习逆袭的新模式,全栈实习生,不8000就业不还实习费
大家好: 我是马伦,也就是多年耕耘在IT培训一线的老马.老马一直怀揣普惠教育梦想初心,一直为莘莘学子能获得高质量的IT教育服务而奋斗. 之前老马在IT培训机构任职讲师多年,也有丰富的教学管理经验.接触 ...
- Python内置函数(43)——type
英文文档: class type(object) class type(name, bases, dict) With one argument, return the type of an obje ...
- wordpress怎么禁止文章复制
登陆你的网站后台--点击菜单栏的"外观"--点击"编辑"--在右侧,找到footer.php,打开它--在</body>之前加入以下代码: 1.禁止 ...
- Python入门之ATM+购物车代码版思维导图
该项目结合了ATM模版和购物车需求,整个思维导图用Python代码实现,使用思维导图可以清晰明了的看清整个框架: 过程中,用到了Python的知识有Python常用模块,Python常用内置包,log ...
- 使用Git进行代码版本管理及协同工作
Git简介: git是一种较为先进的代码版本管理及协同工作平台,采用分布式文件块存储: 1. 分布式: 代码保存在所有协同成员的计算机上,网速较差时依然可用:而传统的集中式代码版本管理系统则较难脱离 ...