洛谷P3768 简单的数学题 莫比乌斯反演+杜教筛
题意简述
求出这个式子
\]
做法
先用莫比乌斯反演拆一下式子
\sum_{i=1}^n\sum_{j=1}^n ij(i,j)&=\sum_{d=1}^nd\sum_{i=1}^n\sum_{j=1}^n ij[(i,j)=d]\\
&=\sum_{d=1}^nd\sum_{i=1}^{\lfloor \frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor \frac{n}{d}\rfloor} id\times jd[(i,j)=1]\\
&=\sum_{d=1}^nd^3\sum_{i=1}^{\lfloor \frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor \frac{n}{d}\rfloor} ij[(i,j)=1]\\
&=\sum_{d=1}^nd^3\sum_{i=1}^{\lfloor \frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor \frac{n}{d}\rfloor} ij \sum_{k\mid i,k\mid j} \mu(k)\\
&=\sum_{d=1}^nd^3\sum_{k=1}^{\lfloor \frac{n}{d}\rfloor} \mu(k) \sum_{i=1}^{\lfloor \frac{n}{kd}\rfloor}\sum_{j=1}^{\lfloor \frac{n}{kd}\rfloor} ik\times jk \\
&=\sum_{d=1}^nd^3\sum_{k=1}^{\lfloor \frac{n}{d}\rfloor} \mu(k) k^2\sum_{i=1}^{\lfloor \frac{n}{kd}\rfloor}\sum_{j=1}^{\lfloor \frac{n}{kd}\rfloor} ij \\
&=\sum_{T=1}^n \sum_{d\mid T}d^3 \mu\left({T \over d}\right) \left({T \over d}\right)^2\sum_{i=1}^{\lfloor \frac{n}{T}\rfloor}\sum_{j=1}^{\lfloor \frac{n}{T}\rfloor} ij \\
&=\sum_{T=1}^n T^2 \sum_{d\mid T}d \mu\left({T \over d}\right) \sum_{i=1}^{\lfloor \frac{n}{T}\rfloor} i^3 \\
&=\sum_{T=1}^n T^2 \varphi (T) \sum_{i=1}^{\lfloor \frac{n}{T}\rfloor} i^3 \\
\end{split}
\]
所以杜教筛直接做\(\sum_i \varphi(i)\),此题结束。
代码实现
请使用C++11
#include<bits/stdc++.h>
using namespace std;
#define re register int
#define db double
#define ll long long
#define ak *
#define in inline
in char getch()
{
static char buf[10000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,10000,stdin),p1==p2)?EOF:*p1++;
}
char qwq;
#define gc() getch()
in ll read()
{
ll cz=0,ioi=1;qwq=gc();
while(qwq<'0'||qwq>'9') ioi=qwq=='-'?~ioi+1:1,qwq=gc();
while(qwq>='0'&&qwq<='9') cz=(cz<<3)+(cz<<1)+(qwq^48),qwq=gc();
return cz ak ioi;
}
const int lim=5000000;
ll inv2,inv6,mod,a,b,c,d,k,t,mu[5000005],vis[5000005],prime[500005],phi[5000005];
unordered_map<ll,ll>smu,sphi;
in void get()
{
mu[1]=phi[1]=1;
for(re i=2;i<=lim;i++)
{
if(!vis[i]) prime[++prime[0]]=i,mu[i]=-1,phi[i]=i-1;
for(re j=1;j<=prime[0];j++)
{
if(i*prime[j]>lim) break;
vis[i*prime[j]]=1;
if(i%prime[j]==0) {mu[i*prime[j]]=0;phi[i*prime[j]]=prime[j]*phi[i]%mod;break;}
else mu[i*prime[j]]=-mu[i],phi[i*prime[j]]=(prime[j]-1)*phi[i]%mod;
}
}
for(re i=2;i<=lim;i++) phi[i]=(phi[i]*1ll*i%mod*i)%mod;
for(re i=2;i<=lim;i++) phi[i]=(phi[i-1]+phi[i])%mod;
}
in ll get1(ll l,ll r)
{
l%=mod;r%=mod;
ll dy=(l+r)%mod*(r-l+1)%mod*inv2%mod;
return dy*dy%mod;
}
in ll get2(ll l,ll r)
{
l%=mod;r%=mod;
return (r%mod*(r+1)%mod*(2ll*r+1)%mod*inv6%mod-(l-1)%mod*(2ll*(l-1)+1)%mod*l%mod*inv6%mod+mod)%mod;
}
ll get_phi(ll n)
{
if(n<=lim) return phi[n];
if(sphi[n]) return sphi[n];
ll res=get1(1,n);
for(ll l=2,r;l<=n;l=r+1)
r=n/(n/l),res=(res-get2(l,r)*get_phi(n/l)%mod+mod)%mod;
return sphi[n]=res;
}
inline ll qpow(ll x,ll y,ll z=1)
{
for(;y;y>>=1,x=x*x%mod) z=(y&1)?x*z%mod:z;
return z;
}
int main()
{
mod=read();get();
ll n=read(),ans=0ll;
inv2=qpow(2,mod-2);inv6=qpow(6,mod-2);
for(ll l=1,r,s;l<=n;l=r+1)
{
r=n/(n/(l));
ans=(ans+(get_phi(r)-get_phi(l-1)+mod)%mod*get1(1,n/l)%mod)%mod;
ans=(ans+mod)%mod;
}
cout<<ans<<endl;
return 0;
}
洛谷P3768 简单的数学题 莫比乌斯反演+杜教筛的更多相关文章
- 「洛谷P3768」简单的数学题 莫比乌斯反演+杜教筛
题目链接 简单的数学题 题目描述 输入一个整数n和一个整数p,你需要求出 \[\sum_{i=1}^n\sum_{j=1}^n (i\cdot j\cdot gcd(i,j))\ mod\ p\] ...
- luogu 3768 简单的数学题 (莫比乌斯反演+杜教筛)
题目大意:略 洛谷传送门 杜教筛入门题? 以下都是常规套路的变形,不再过多解释 $\sum\limits_{i=1}^{N}\sum\limits_{j=1}^{N}ijgcd(i,j)$ $\sum ...
- LOJ#6229. 这是一道简单的数学题(莫比乌斯反演+杜教筛)
题目链接 \(Description\) 求\[\sum_{i=1}^n\sum_{j=1}^i\frac{lcm(i,j)}{gcd(i,j)}\] 答案对\(10^9+7\)取模. \(n< ...
- [复习]莫比乌斯反演,杜教筛,min_25筛
[复习]莫比乌斯反演,杜教筛,min_25筛 莫比乌斯反演 做题的时候的常用形式: \[\begin{aligned}g(n)&=\sum_{n|d}f(d)\\f(n)&=\sum_ ...
- 【bzoj3930】[CQOI2015]选数 莫比乌斯反演+杜教筛
题目描述 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公约数,以便进一 ...
- [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛)
[BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛) 题面 我们知道,从区间\([L,R]\)(L和R为整数)中选取N个整数,总共有\((R-L+1)^N\)种方案.求最大公约数 ...
- 洛谷 - P3768 - 简单的数学题 - 欧拉函数 - 莫比乌斯反演
https://www.luogu.org/problemnew/show/P3768 \(F(n)=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}ijgcd(i ...
- 【刷题】洛谷 P3768 简单的数学题
题目描述 由于出题人懒得写背景了,题目还是简单一点好. 输入一个整数n和一个整数p,你需要求出(\(\sum_{i=1}^n\sum_{j=1}^n ijgcd(i,j))~mod~p\),其中gcd ...
- 洛谷 P3768 简单的数学题 解题报告
P3768 简单的数学题 题目描述 由于出题人懒得写背景了,题目还是简单一点好. 输入一个整数\(n\)和一个整数\(p,\)你需要求出\((\sum_{i=1}^n\sum_{j=1}^n ijgc ...
随机推荐
- Delphi XE2 之 FireMonkey 入门(35) - 控件基础: TFmxObject: 其它
Delphi XE2 之 FireMonkey 入门(35) - 控件基础: TFmxObject: 其它 TFmxObject 增加了 TagObject.TagFloat.TagString, 算 ...
- 阶段3 1.Mybatis_01.Mybatis课程介绍及环境搭建_07.环境搭建的注意事项
2 resources下面创建目录要一级一级的创建,下面这个创建的就是一级目录而不是三级 在文件夹下看到的目录也是一级的 因此这里创建目录需要一个个的去创建 配置文件和dao类这两个目录要保持一致,这 ...
- jmeter遍历时间戳
list如下 实现步骤 实现步骤其实很简单,只需要一个foreach控制器,和一段转换时间戳的代码 第一步把时间戳提取出来 第二步把提取的时间戳传入foreach控制器,然后在控制器下面遍历转换 im ...
- Django 实现分库
网站后端的数据库随着业务的不断扩大,用户的累积,数据库的压力会逐渐增大.一种办法是优化使用方法,也就是的优化 SQL 语句啦,添加缓存以达到减少存取的目的:另外一种办法是修改使用架构,在数据库层面上「 ...
- itchat监听微信撤回消息
import itchat from itchat.content import * import re msg_infomation = {} # 监听发送消息 @itchat.msg_regist ...
- python winsound模块
(目标:出现交易下单.结束成交.数据中断等信号的时候,PC 发出声音提醒.) python winsound模块 winsound是Python的内置包,无需下载.可以直接通过 import wins ...
- [19/05/29-星期三] JavaScript_ 函数的简介
一.函数的简介 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <t ...
- 小z的洞穴之旅 QDUOJ 并查集+连通块
小z的洞穴之旅 QDUOJ 并查集+连通块 原题链接 题意 小 z 同学在某个闲暇的周末决定去野外探险一波,结果在丛林深处中误打误撞进入了一个神秘的洞穴,虽然洞穴中光线昏暗,但小 z 凭借其敏锐的眼力 ...
- vue-sticky组件详解
sticky简介 sticky的本意是粘的,粘性的,使用其进行的布局被称为粘性布局. sticky是position属性新推出的值,属于CSS3的新特性,常用与实现吸附效果. 设置了sticky布局的 ...
- 坐标轴刻度取值算法-基于魔数数组-源于echarts的y轴刻度计算需求
本文链接:https://blog.csdn.net/qq_26909801/article/details/96966372数值型坐标轴刻度计算算法前言算法描述上代码代码运行效果结语前言因实习的公司 ...