【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\) ...
随机推荐
- JS实现全排列
https://www.jb51.net/article/39291.htm JavaScript全排列的六种算法 具体实现 算法一:交换(递归) 复制代码代码如下: <html xmlns=& ...
- Happy Equation
Source: The 10th Shandong Provincial Collegiate Programming Contest 题解: 因为2^p为偶数,所以a,x的奇偶性相同 1.当a为奇数 ...
- 2018.4.9 Ubuntu install kreogist-mu
先下载kreogist m文件 然后在下载哪里右键点击打开终端 输入sudo dpkg -i + 文件名 输入密码 下一步会显示 未安装未安装软件包 libmpv1. jiexialai要处理 sud ...
- cocos2dx 通过jni调用安卓底层方法
cocos2dx通过封装JniHelper类来调用安卓api底层函数,该文件在cocos/platform/android/jni/JniHelper.h,使用方法如下: 打开eclipse,导入co ...
- Check for Palindromes-freecodecamp算法题目
Check for Palindromes(检查回文字符串) 要求 给定的字符串是回文,返回true,反之,返回false.(如果一个字符串忽略标点符号.大小写和空格,正着读和反着读一模一样,那么这个 ...
- 【模拟】HHHOJ#251. 「NOIP模拟赛 伍」高精度
积累模拟经验 题目描述 维护一个二进制数,支持如下操作 "+" 该数加 11 "-" 该数减 11 "*" 该数乘 22 "\&q ...
- Python爬虫系列-分析Ajax请求并抓取今日头条街拍图片
1.抓取索引页内容 利用requests请求目标站点,得到索引网页HTML代码,返回结果. 2.抓取详情页内容 解析返回结果,得到详情页的链接,并进一步抓取详情页的信息. 3.下载图片与保存数据库 将 ...
- python爬虫基础10-selenium大全4/8-Webelement
Selenium笔记(4)Webelement 本文集链接:https://www.jianshu.com/nb/25338984 这是通过find方法找到的页面元素,此对象提供了多种方法,让我们可以 ...
- MySQL练习50题
介绍一个学习SQL的网站:https://sqlbolt.com/ 习题来源于网络,SQL语句是自己的练习答案,部分参考了网络上的答案. 花了一晚上的时间做完,个人认为其中的难点有:分组提取前几名的数 ...
- Python9-进程池-day38
复习 # 信号量 from multiprocessing import Semaphore # 用锁的原理实现的,内置了一个计数器 # 在同一个事件,只能有指定数量的进程执行某一段被控制住的代码 # ...