【Luogu】P3768简单的数学题(杜教筛)
emm标题全称应该叫“莫比乌斯反演求出可狄利克雷卷积的公式然后卷积之后搞杜教筛”
然后成功地困扰了我两天qwq
我们从最基本的题意开始,一步步往下推
首先题面给出的公式是$\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}ijgcd(i,j)$
枚举gcd(i,j)=w,得到
$\sum\limits_{w=1}^{n}w\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}ij[w=gcd(i,j)]$
这时候我们设一个$f(x)=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}ij[x=gcd(i,j)]$
一个$F(x)=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}ij[x|gcd(i,j)]$
容易发现(其实就是为了凑莫比乌斯公式才搞的这两个函数,在构造函数之前就“容易发现”了)
$F(x)=\sum\limits_{x|d}f(d)$
怎么样……像莫比乌斯反演公式吧
$f(d)=\sum\limits_{d|x}\mu(\frac{x}{d})F(x)$
然后原式就变成了
$\sum\limits_{w=1}^{n}w\sum\limits_{w|t}\mu(\frac{t}{w})F(t)$
据说莫比乌斯反演构造的F(x)一定要简单易求
然后……自己找几组规律可以发现$F(x)=(x+2x+3x+......+\frac{n}{x}x)^2$
然后……继续找规律发现一个问题,就是你可以把x提出来。qwq。
于是F(x)成功的变成了$x^2(1+2+3+......+\frac{n}{x})^2$
然后我们回头去找扔掉的原式qwq
原式=$\sum\limits_{w=1}^{n}w\sum\limits_{w|t}\mu(\frac{t}{w})F(t)$
$=\sum\limits_{w=1}^{n}w^3\sum\limits_{w|t}\mu(\frac{t}{w})\frac{t}{w}^2(1+.......+\frac{n}{t})^2$
emm我们似乎发现了什么……
于是就设$d=\frac{t}{w}$
然后把原式就整理成了
$\sum\limits_{w=1}^{n}w^3\sum\limits_{d=1}^{\frac{n}{w}}\mu(d)d^2(1+.......+\frac{n}{wd})^2$
到此为止就有60分啦。不需要杜教筛狄利克雷卷积什么乱七八糟的玩意。
(然后剩下40分花掉了我一天+22个半小时)
然后我自己差不多就想到这里为止了。剩下的是rqy的脑补。
看到这里面一大堆下取整的玩意我们rqy非常不爽。
然后他先把公式颠倒了一下
$\sum\limits_{d=1}^{n}\mu(d)d^2\sum\limits_{w=1}^{\frac{n}{d}}w^3(1+......+\frac{n}{wd})^2$
又令k=wd
然后改成枚举k
式子就变成了$\sum\limits_{k=1}^{n}\sum\limits_{d|k}\mu(\frac{k}{d})(\frac{k}{d})^2d^3(1+....+\frac{n}{k})^2$
=$\sum\limits_{k=1}^{n}\sum\limits_{d|k}\mu(\frac{k}{d})k^2d(1+....+\frac{n}{k})^2$
发现有两项$k^2$,$(1+....+\frac{n}{k})^2$跟d没什么卵关系
提出来提出来
$\sum\limits_{k=1}^{n}k^2(1+....+\frac{n}{k})^2\sum\limits_{d|k}\mu(\frac{k}{d})d$
好,恭喜你$\sum\limits_{d|k}\mu(\frac{k}{d})d=\phi(k)$
为什么呢?因为根据狄利克雷卷积公式$\mu*1=e$
$\phi*1=n$
所以$n*\mu=\phi*1*\mu=\phi*e=\phi$
然后你列一列这个卷积公式。
惊不惊喜?意不意外?
然后原式变成了$\sum\limits_{k=1}^{n}k^2(1+....+\frac{n}{k})^2\phi(k)$
然后一看到$\frac{n}{k}$有根号n种,非常激动,
然后现在的问题就变成了怎么快速求$k^2\phi(k)$的前缀和
然后发现这个玩意用杜教筛好像很可做的样子
码了码了
#include<cstdio>
#include<cstring>
#include<cctype>
#include<cstdlib>
#include<algorithm>
#include<map>
#define maxn 4000100
using namespace std; map<long long,long long>_sum;
long long sum[maxn];
long long phi[maxn];
long long prime[maxn],tot;
bool vis[maxn];
long long mod;
long long mod6; long long Pow(long long n,long long i,long long p){
long long ret=;
while(i){
if(i&) ret=(ret*n)%p;
n=(n*n)%p;
i>>=;
}
return ret;
} inline long long calc(long long n,long long p){
n%=p;
long long ans=((+n)*n%p)*mod%p;
ans=(ans*ans)%p;
return ans;
} inline long long calcs(long long n,long long p){
n%=p;
long long ans=(n*(n+)%p)*(*n+)%p;
ans=ans*mod6%p;
return ans;
} long long calcsum(long long n,long long p){
if(n<maxn) return sum[n];
if(_sum.count(n)) return _sum[n];
long long x=,ans=calc(n,p);
while(x<=n){
long long y=n/(n/x);
ans=((ans-((calcs(y,p)-calcs(x-,p)+p)%p)*calcsum(n/x,p)%p)+p)%p;
x=y+;
}
return _sum[n]=ans;
} int main(){
long long p,n;
scanf("%lld%lld",&p,&n);
mod=Pow(,p-,p);
mod6=Pow(,p-,p);
vis[]=sum[]=;
for(register long long i=;i<maxn;++i){
if(!vis[i]){
prime[++tot]=i;
phi[i]=i-;
sum[i]=((1LL*i*i)%p*phi[i])%p;
}
for(long long j=;j<=tot&&i*prime[j]<maxn;++j){
vis[i*prime[j]]=;long long now=i*prime[j];
if(i%prime[j]){
phi[now]=(phi[i]*(prime[j]-))%p;
sum[now]=(phi[now]*now)%p*now%p;
}
else{
phi[now]=(phi[i]*prime[j])%p;
sum[now]=(phi[now]*now)%p*now%p;
break;
}
}
}
for(long long i=;i<maxn;++i) sum[i]=(sum[i]+sum[i-])%p;
long long x=,ans=;
while(x<=n){
long long y=n/(n/x);
ans+=((calcsum(y,p)-calcsum(x-,p)+p)%p)*calc(n/x,p)%p;
ans%=p;
x=y+;
}
printf("%lld",ans);
return ;
}
然后这就是码qwq。
【Luogu】P3768简单的数学题(杜教筛)的更多相关文章
- luogu P3768 简单的数学题 杜教筛 + 欧拉反演 + 逆元
求 $\sum_{i=1}^{n}\sum_{j=1}^{n}ijgcd(i,j)$ 考虑欧拉反演: $\sum_{d|n}\varphi(d)=n$ $\Rightarrow \sum_{i ...
- P3768 简单的数学题 杜教筛+推式子
\(\color{#0066ff}{ 题目描述 }\) 由于出题人懒得写背景了,题目还是简单一点好. 输入一个整数n和一个整数p,你需要求出(\(\sum_{i=1}^n\sum_{j=1}^n ij ...
- P3768 简单的数学题 [杜教筛,莫比乌斯反演]
\[\sum_{i=1}^{n}\sum_{j=1}^{n} ij\gcd(i,j)\] \[=\sum_{d=1}^{n} d \sum_{i=1}^{n}\sum_{j=1}^{n} ij[\gc ...
- [luogu3768] 简单的数学题 [杜教筛]
题面: 传送门 实际上就是求: 思路: 看到gcd就先反演一下,过程大概是这样: 明显的一步反演 这里设,S(x)等于1到x的和 然后把枚举d再枚举T变成先枚举T再枚举其约数d,变形: 后面其中两项展 ...
- Luogu P3768 简单的数学题
非常恶心的一道数学题,推式子推到吐血. 光是\(\gcd\)求和我还是会的,但是多了个\(ij\)是什么鬼东西. \[\sum_{i=1}^n\sum_{j=1}^nij\gcd(i,j)=\sum_ ...
- Luogu 4213 【模板】杜教筛(Sum)
当作杜教筛的笔记吧. 杜教筛 要求一个积性函数$f(i)$的前缀和,现在这个东西并不是很好算,那么我们考虑让它卷上另外一个积性函数$g(i)$,使$(f * g)$的前缀和变得方便计算,然后再反推出这 ...
- luogu P4213 【模板】杜教筛(Sum)
Code: #include <bits/stdc++.h> #include <tr1/unordered_map> using namespace std; using n ...
- 「洛谷P3768」简单的数学题 莫比乌斯反演+杜教筛
题目链接 简单的数学题 题目描述 输入一个整数n和一个整数p,你需要求出 \[\sum_{i=1}^n\sum_{j=1}^n (i\cdot j\cdot gcd(i,j))\ mod\ p\] ...
- 洛谷P3768 简单的数学题 【莫比乌斯反演 + 杜教筛】
题目描述 求 \[\sum\limits_{i=1}^{n} \sum\limits_{j=1}^{n} i*j*gcd(i,j) \pmod{p}\] \(n<=10^{10}\),\(p\) ...
随机推荐
- SubSonic框架使用图解
简介:SubSonic框架是一个优秀的.开源的ORM映射框架,同时提供符合自身需要的代码生成器. 官方下载地址:http://subsonicproject.com/Download 明白了SubSo ...
- 题解 P5051 【[COCI2017-2018#7] Timovi】
看到这道题目,数据范围,心凉了一大截 这是没开O2的 而这是开了O2的 emm……本蒟蒻也无言以对呀 好了,回归正题,看到题目的标签,高性能,自然而然地想到了快读 相信做这题的大佬们一定知道吧! 快读 ...
- java基础—抽象类介绍
一.抽象类介绍
- RabbitMQ 学习资料
https://www.rabbitmq.com/getstarted.html http://www.cnblogs.com/luxiaoxun/p/3918054.html http://back ...
- jQuery向界面输出时保留两位小数
通过JSTL下的<fmt:formatNumber>标签实现,具体实现代码如下: <%@ taglib uri="http://java.sun.com/jsp/jstl/ ...
- 删除sqlserver管理器登录信息缓存
在Windows10下测试有效: C:\Users\<user>\AppData\Roaming\Microsoft\Microsoft SQL Server\100\Tools\Shel ...
- Linux运维笔记--第二部
第2部-重要目录结构详解 1.回顾Linux目录结构知识 /dev/ 设备目录 /etc/ 系统配置及服务配置文件,启动命令的目录 /proc ...
- 如何理解JavaScript中的this关键字
前言 王福朋老师的 JavaScript原型和闭包系列 文章看了不下三遍了,最为一个初学者,每次看的时候都会有一种 "大彻大悟" 的感觉,而看完之后却总是一脸懵逼.原型与闭包 可以 ...
- Postgres-XL的限制
Postgres-XL是基于PostgreSQL的一个分布式数据库. 相比于PostgreSQL,XL的表的数据是可以分布到不同的datanode上的,对存在于不同的datanode上的数据进行处理, ...
- Bzoj 1131[POI2008]STA-Station (树形DP)
Bzoj 1131[POI2008]STA-Station (树形DP) 状态: 设\(f[i]\)为以\(i\)为根的深度之和,然后考虑从他父亲转移. 发现儿子的深度及其自己的深度\(-1\) 其余 ...