洛谷 - P3768 - 简单的数学题 - 欧拉函数 - 莫比乌斯反演
https://www.luogu.org/problemnew/show/P3768
\(F(n)=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}ijgcd(i,j)\)
首先加入方括号并枚举g,提gcd的g:
\(\sum\limits_{g=1}^{n}g\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}ij[gcd(i,j)==g]\)
后面的方括号里的g也可以提出来,注意前面有两个id,所以:
\(\sum\limits_{g=1}^{n}g^3 \sum\limits_{i=1}^{\lfloor\frac{n}{g}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{n}{g}\rfloor}ij[gcd(i,j)==1]\)
记 \(G(n)=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}ij[gcd(i,j)==1]\) ,则 \(F(n)=\sum\limits_{g=1}^{n}g^3 G(\lfloor\frac{n}{g}\rfloor)\) ,\(F(n)\)可以一次对\(G(\lfloor\frac{n}{g}\rfloor)\)分块求出来。
关注 \(G(n)\) 怎么求。
先把 \(G(n)\) 分成两半,设 \(H_1(n)=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{i}ij[gcd(i,j)==1]\) ,显然 \(G(n)=2*H_1(n)-1\)
又设\(H_2(n)=\sum\limits_{i=1}^{n}in[gcd(i,n)==1]\) ,则 $H_1(n)=\sum\limits_{i=1}^{n}H_2(i) $
而\(H_2(n)=n\sum\limits_{i=1}^{n}i[gcd(i,n)==1]\),这个不是在疯狂lcm里面见过吗?和一个数gcd为1的不比他大的数的和。
直接套上去:
\(H_2(n)=nH(n)=\frac{n^2}{2}([n==1]+\varphi(n))\)
所以:
\(H_1(n)=\sum\limits_{i=1}^{n}H_2(i) = \sum\limits_{i=1}^{n} \frac{i^2}{2}([i==1]+\varphi(i))\)
故:
\(G(n)=\sum\limits_{i=1}^{n} i^2 ([i==1]+\varphi(i)) -1= \sum\limits_{i=1}^{n} i^2 \varphi(i)\)
感觉可以用杜教筛来求,先线性筛出1e7以内的 \(G(n)\)。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n;
int mod;
int inv2;
const int MAXN=1e7;
int pri[MAXN+1];
int &pritop=pri[0];
int B[2*MAXN+1];
int pk[MAXN+1];
void sieve(int n=MAXN) {
memset(B,-1,sizeof(B));
B[0]=0;
pk[1]=1;
B[1]=1;
for(int i=2; i<=n; i++) {
if(!pri[i]) {
pri[++pritop]=i;
pk[i]=i;
ll tmp=1ll*i*i;
if(tmp>=mod)
tmp%=mod;
tmp*=(i-1);
if(tmp>=mod)
tmp%=mod;
B[i]=tmp;
}
for(int j=1; j<=pritop; j++) {
int &p=pri[j];
int t=i*p;
if(t>n)
break;
pri[t]=1;
if(i%p) {
pk[t]=p;
ll tmp=1ll*B[i]*B[p];
if(tmp>=mod)
tmp%=mod;
B[t]=tmp;
} else {
pk[t]=pk[i]*p;
if(pk[t]==t) {
ll tmp=1ll*t*t;
if(tmp>=mod)
tmp%=mod;
tmp*=(t-i);
if(tmp>=mod)
tmp%=mod;
B[t]=tmp;
} else {
ll tmp=1ll*B[t/pk[t]]*B[pk[t]];
if(tmp>=mod)
tmp%=mod;
B[t]=tmp;
}
break;
}
}
}
for(int i=1; i<=n; i++) {
ll tmp=(ll)B[i]+B[i-1];
if(tmp>=mod)
tmp-=mod;
B[i]=tmp;
}
}
inline ll qpow(ll x,ll n) {
if(x>=mod)
x%=mod;
ll res=1;
while(n) {
if(n&1) {
res*=x;
if(res>=mod)
res%=mod;
}
x*=x;
if(x>=mod)
x%=mod;
n>>=1;
}
return res;
}
int inv4;
int inv6;
inline int s2(ll n) {
if(n>=mod)
n%=mod;
ll tmp=n*(n+1);
if(tmp>=mod)
tmp%=mod;
tmp*=(n*2+1);
if(tmp>=mod)
tmp%=mod;
tmp*=inv6;
if(tmp>=mod)
tmp%=mod;
return tmp;
}
inline int s3(ll n) {
if(n>=mod)
n%=mod;
ll tmp=n*(n+1);
if(tmp>=mod)
tmp%=mod;
tmp*=tmp;
if(tmp>=mod)
tmp%=mod;
tmp*=inv4;
if(tmp>=mod)
tmp%=mod;
return tmp;
}
inline int id(ll x){
if(x<=MAXN)
return x;
else
return n/x+MAXN;
}
inline int S(ll n) {
int idn=id(n);
if(B[idn]!=-1)
return B[idn];
ll ret=s3(n);
for(ll l=2,r; l<=n; l=r+1) {
ll t=n/l;
r=n/t;
ll tmp=s2(r)-s2(l-1);
if(tmp<0)
tmp+=mod;
tmp*=S(t);
if(tmp>=mod)
tmp%=mod;
ret-=tmp;
}
ret%=mod;
if(ret<0)
ret+=mod;
return B[idn]=ret;
}
inline int F(ll n){
ll res=0;
for(ll l=1,r;l<=n;l=r+1){
ll t=n/l;
r=n/t;
ll tmp=s3(r)-s3(l-1);
if(tmp<0)
tmp+=mod;
tmp*=S(t);
if(tmp>=mod)
tmp%=mod;
res+=tmp;
}
if(res>=mod)
res%=mod;
return res;
}
int main() {
#ifdef Yinku
freopen("Yinku.in","r",stdin);
#endif // Yinku
scanf("%d%lld",&mod,&n);
inv2=qpow(2,mod-2);
inv4=qpow(4,mod-2);
inv6=qpow(6,mod-2);
sieve(min(n,(ll)MAXN));
printf("%d\n",F(n));
return 0;
}
洛谷 - P3768 - 简单的数学题 - 欧拉函数 - 莫比乌斯反演的更多相关文章
- 【刷题】洛谷 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 ...
- 洛谷UVA12995 Farey Sequence(欧拉函数,线性筛)
洛谷题目传送门 分数其实就是一个幌子,实际上就是求互质数对的个数(除开一个特例\((1,1)\)).因为保证了\(a<b\),所以我们把要求的东西拆开看,不就是\(\sum_{i=2}^n\ph ...
- 洛谷P2568 GCD (欧拉函数/莫比乌斯反演)
P2568 GCD 题目描述 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. 输入输出格式 输入格式: 一个整数N 输出格式: 答案 输入输出样例 输入 ...
- 【luogu3768】简单的数学题 欧拉函数(欧拉反演)+杜教筛
题目描述 给出 $n$ 和 $p$ ,求 $(\sum\limits_{i=1}^n\sum\limits_{j=1}^nij\gcd(i,j))\mod p$ . $n\le 10^{10}$ . ...
- 洛谷P3601签到题(欧拉函数)
题目背景 这是一道签到题! 建议做题之前仔细阅读数据范围! 题目描述 我们定义一个函数:qiandao(x)为小于等于x的数中与x不互质的数的个数. 这题作为签到题,给出l和r,要求求. 输入输出格式 ...
- 洛谷$P1390$ 公约数的和 欧拉函数
正解:欧拉函数 解题报告: 传送门$QwQ$ 首先显然十分套路地变下形是趴 $\begin{align*}&=\sum_{i=1}^n\sum_{j=1}^n gcd(i,j)\\&= ...
- UVA11426 GCD - Extreme (II) (欧拉函数/莫比乌斯反演)
UVA11426 GCD - Extreme (II) 题目描述 PDF 输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例#1: 10 100 200000 0 输出样例#1: 67 13 ...
- BZOJ 2818 GCD 【欧拉函数 || 莫比乌斯反演】
传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=2818 2818: Gcd Time Limit: 10 Sec Memory Limit ...
随机推荐
- EasyDarwin开源流媒体服务器将select改为epoll的方法
本文来自EasyDarwin团队Fantasy(fantasy(at)easydarwin.org) 一. EasyDarwin网络模型介绍 EventContext负责监听所有网络读写事件,Even ...
- win10获取注册表权限
1.cmd中输入regedit打开注册表 2.在需要的注册表项中右键选择“权限”
- 支付宝cookie 是支付密码 不是登录密码
开发文档/ 手机网站支付 / 产品介绍 开放平台文档中心 https://docs.open.alipay.com/203/105288
- 【R】R语言生成随机数
1.概述 作为一种语言进行统计分析,R有一个随机数生成各种统计分布功能的综合性图书馆.R语言可以针对不同的分布,生成该分布下的随机数.其中,有许多常用的个分布可以直接调用.本文简单介绍生成常用分布随机 ...
- 升级python到最新2.7.13
python2.7是2.X的最后一个版本,同时也加入了一部分3.X的新特性.并且具有更好的性能,修改多个bug.所以决定升级到最新的2.7版,我的目前的版本是2.6.6 查看当前python版本 # ...
- Windows程序设计(0)——编程之前
Windows程序设计之前 1 做什么 2 解决什么问题 3 有哪些资源 在开始真正的编程之前,需要了解要做的事情是什么,要解决的解决的问题是什么,有哪些资源可以使用. 1 Windows程序设计之前 ...
- Eclipse快捷键【转载】
分享一前辈的博客-Eclipse快捷键
- led子系统【转】
本文转载自:http://blog.csdn.net/yuanlulu/article/details/6438841 版权声明:本文为博主原创文章,未经博主允许不得转载. ============= ...
- Gym - 100283F F. Bakkar In The Army —— 二分
题目链接:http://codeforces.com/gym/100283/problem/F F. Bakkar In The Army time limit per test 2 seconds ...
- WebDriver API——鼠标及键盘操作Actions
在自动化中我们可能需要用到鼠标或者是键盘操作,在webdriver中是Actions类进行这些操作的. 代码如下: Actions action = new Actions(driver); //-- ...