【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\) ...
随机推荐
- JAVA多线程编程——JAVA内存模型
一.何为“内存模型” 内存模型描述了程序中各个变量(实例域.静态域和数组元素)之间的关系,以及在实际计算机系统中将变量存储到内存和从内存中取出变量这样的底层细节,对象最终是存储在内存里面的,但是编译器 ...
- CDOJ 490 UESTC 490 Swap Game(思路,逆序对)
题意:有两种颜色的小球形成环,求最小交互次数使球相连. 题解:先解决另一个简单的问题,如果是一个链,把红球标记为1,蓝球标记为0,要排成升序需要多少次交换呢?答案是逆序对总数,原因是一次交互最多消除一 ...
- iOS 微信和支付宝关于回调处理
在支付这一块,发现讲支付集成的比较多,但是关于支付后回调处理的不多见,(当时因为这个问题懵逼了好久)就自己总结一下, 1.支付宝回调 支付宝的回调想对来说比较简单一些,因为支付宝的回调就在调起支付宝的 ...
- Write Once, Run Anywhere:这不是Java,这是C#
注意,本文目的并非挑起语言之争.虽然有为C#平反之意,但主要还是介绍Mono并进行简单的测试. UPDATED: 25th August 2012 更新了「Compile Once, Run Anyw ...
- centos7 python3 Saltstack配置
Python安装完毕后,提示找不到ssl模块 pip is configured with locations that require TLS/SSL, however the ssl module ...
- java中的同步与异步
在多线程的环境中,经常会碰到数据的共享问题,即当多个线程需要访问同一个资源时,它们需要以某种顺序来确保该资源在某--时刻只能被-一个线程使用,否则,程序的运行结果将会是不可预料的,在这种情况下就必须对 ...
- skynet 学习笔记-netpack模块(1)
int luaopen_netpack(lua_State *L) { luaL_checkversion(L); luaL_Reg l[] = { { "pop", lpop } ...
- thinkcmf常用标签
1.图片地址:{:cmf_get_image_url($vo.icon)} 2.模板控件 模板变量调用:$theme_vars.title <widget name="aboutUs& ...
- 教程笔记《JavaScript深入浅出》
一.数据类型 javascript是弱数据类型语言,不需要显式的定义类型,一共有如下六种数据类型 五种基本类型:number,string,boolean,null,undefined 一种复合类型: ...
- nrf51822微信开发2:[转]airkiss/airsync介绍
"微信蓝牙"专题共分为8部分 1.airkiss/airsync介绍 2.eclipes的j2ee软件使用教程 3.微信公众号使用Dome(airkiss/airsync) 4.新 ...