[题解] LuoguP3768 简单的数学题
Description
给一个整数\(n\),让你求
\]
对一个大质数\(p\)取模。
保证\(n \le 10^{10},5\times 10^{8} \le p \le 1.1 \times 10^9\),\(p\)为质数
Solutions
先来推柿子好了,枚举\(\gcd\)的取值,有
Ans&=\sum\limits_{k} k\sum\limits_{i=1}^n\sum\limits_{j=1}^n ij[\gcd(i,j)=k] \\
&=\sum\limits_{k} k^3 \sum\limits_{i=1}^{\lfloor\frac{n}{k}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{n}{k}\rfloor} ij[\gcd(i,j)=1]
\end{aligned}
\]
考虑求\(Sum(n)=\sum\limits_{i=1}^n\sum\limits_{j=1}^n ij[\gcd(i,j)=1]\)
推柿子
Sum(n)&=\sum\limits_{i=1}^n\sum\limits_{j=1}^n ij\sum\limits_{d\mid \gcd(i,j)} \mu(d) \\
&= \sum\limits_{d} \mu(d) \sum\limits_{i=1}^{\lfloor n/d\rfloor}id\sum\limits_{j=1}^{\lfloor n/d\rfloor} jd \\
&= \sum\limits_{d} \mu(d)d^2 s(\lfloor\frac{n}{d}\rfloor)^2
\end{aligned}
\]
其中\(s(n)=1+2+\cdots+n=\frac{n(n+1)}{2}\)。
所以
Ans&=\sum\limits_{k} k^3 Sum(\lfloor\frac{n}{k}\rfloor) \\
&=\sum\limits_{k} k^3 \sum\limits_{d} \mu(d)d^2 s(\lfloor\frac{\lfloor n/k\rfloor}{d}\rfloor) \\
&=\sum\limits_{k} k^3 \sum\limits_{d} \mu(d)d^2 s(\lfloor\frac{n}{kd}\rfloor)
\end{aligned}
\]
枚举\(T=kd\),有
Ans&=\sum\limits_{T} s(\lfloor\frac{n}{T}\rfloor) \sum\limits_{d\mid T} \mu(d)d^2(\frac{T}{d})^3 \\
&=\sum\limits_{T} s(\lfloor\frac{n}{T}\rfloor)T^2\sum\limits_{d\mid T}\mu(d)\times \frac{T}{d}
\end{aligned}
\]
令\(f(n)=n^2\sum\limits_{d\mid n} \mu(d)\times \frac{n}{d}\),如果能快速求出\(f\)的前缀和的话我们对上面的柿子数论分块就好了。
观察到后面的和式是\(\mu\)与\(id\)的Dirichlet卷积的形式,假设
\]
根据莫比乌斯反演的结论,必有
\]
可以得到\(F(n)=\varphi(n)\),所以\(f(n)=n^2\varphi(n)\),我们想快速求出\(f\)的前缀和,\(n\le 10^{10}\),线筛又死了。
可以考虑杜教筛(djs?),令\(S(n)=\sum\limits_{i=1}^n f(i)\),我们想找到另一个积性函数\(g\),让\(f*g\)好看一点,我们知道欧拉函数有一个很美妙的性质\(\sum\limits_{d\mid n} \varphi(n)=n\),所以为了把\(f\)中的\(n^2\)消掉,配\(g(n)=n^2\)即可,有
\]
即\(h(n)=n^2\sum\limits_{d\mid n} \varphi(n)=n^3\),
愉快的套柿子
\]
用一点小学奥数的知识,我们知道\(1^3+2^3+\cdots+n^3=(1+2+\cdots+n)^2\),\(1^2+2^3+\cdots+n^2=\frac{n(n+1)(2n+1)}{6}\),所以
\]
后面的显然可以数论分块,于是处理\(f\)的前缀和的话杜教筛就好了。
再写一遍答案的柿子
\]
对\(T\)数论分块+杜教筛就没了。
#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for (int i=(a);i<(b);++i)
#define per(i,a,b) for (int i=(a)-1;i>=(b);--i)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
typedef double db;
typedef long long ll;
typedef pair<int,int> PII;
typedef vector<int> VI;
const int maxn=5e6,N=maxn+10;
int mod,i2,i6;
inline int add(int x,int y) {return (x+=y)>=mod?x-mod:x;}
inline int sub(int x,int y) {return (x-=y)<0?x+mod:x;}
inline int normal(ll x) {return x<0?x+mod:x;}
inline int fpow(int x,int y) {
int ret=1; for(;y;y>>=1,x=1ll*x*x%mod)
if(y&1) ret=1ll*ret*x%mod;
return ret;
}
inline int sqr(int x) {return 1ll*x*x%mod;}
inline void initmod(int P) {
mod=P;
i2=fpow(2,mod-2),i6=fpow(6,mod-2);
}
inline int ss1(ll n) {n%=mod;return 1ll*n*(n+1)%mod*i2%mod;}
inline int ss2(ll n) {n%=mod;return 1ll*n*(n+1)%mod*(2*n+1)%mod*i6%mod;}
inline int s1(ll l,ll r) {return sub(ss1(r),ss1(l-1));}
inline int s2(ll l,ll r) {return sub(ss2(r),ss2(l-1));}
int p[N],pn,phi[N];
bool vis[N];
void sieve(int n) {
phi[1]=1;
rep(i,2,n+1) {
if(!vis[i]) {phi[i]=i-1;p[pn++]=i;}
for(int j=0;j<pn&&i*p[j]<=n;j++) {
vis[i*p[j]]=1;
if(i%p[j]==0) {phi[i*p[j]]=phi[i]*p[j];break;}
else phi[i*p[j]]=phi[i]*phi[p[j]];
}
}
rep(i,1,n+1) phi[i]=add(phi[i-1],1ll*i*i%mod*phi[i]%mod);
}
map<ll,int> fsum;
int Sf(ll n) {
if(n<=maxn) return phi[n];
if(fsum.count(n)) return fsum[n];
int ans=sqr(ss1(n));
for(ll l=2,r=0;l<=n;l=r+1) {
r=n/(n/l);
ans=sub(ans,1ll*s2(l,r)*Sf(n/l)%mod);
}
return fsum[n]=ans;
}
int main() {
#ifdef LOCAL
freopen("a.in","r",stdin);
#endif
int p; ll n; scanf("%d%lld",&p,&n);
initmod(p),sieve(maxn);
int ans=0;
for(ll l=1,r=0;l<=n;l=r+1) {
r=n/(n/l);
ans=add(ans,1ll*sub(Sf(r),Sf(l-1))*sqr(ss1(n/l))%mod);
}
printf("%d\n",ans);
return 0;
}
[题解] LuoguP3768 简单的数学题的更多相关文章
- luoguP3768 简单的数学题
题目链接 luoguP3768 简单的数学题 题解 上面那个式子的最后一步,需要定理 用数学归纳法证明 \(S1=1^3=1^2\) \(S2=1^3+2^3=9=3^2=(1+2)^2\) \(S3 ...
- luoguP3768简单的数学题
大佬们绕道吧(或跳到错误&启发后下一根横线后) 这道题吧正解是莫比乌斯反演吧,但本人有一种独创玄妙的想法去偏分 这道题是让我们求这个对吧 \((\sum_{i=1}^n\sum_{j=1}^n ...
- 【Luogu3768】简单的数学题(莫比乌斯反演,杜教筛)
[Luogu3768]简单的数学题(莫比乌斯反演,杜教筛) 题面 洛谷 \[求\sum_{i=1}^n\sum_{j=1}^nijgcd(i,j)\] $ n<=10^9$ 题解 很明显的把\( ...
- 【LG3768】简单的数学题
[LG3768]简单的数学题 题面 求 \[ (\sum_{i=1}^n\sum_{j=1}^nij\text{gcd}(i,j))\text{mod}p \] 其中\(n\leq 10^{10},5 ...
- loj#6229 这是一道简单的数学题
\(\color{#0066ff}{ 题目描述 }\) 这是一道非常简单的数学题. 最近 LzyRapxLzyRapx 正在看 mathematics for computer science 这本书 ...
- 「洛谷P3768」简单的数学题 莫比乌斯反演+杜教筛
题目链接 简单的数学题 题目描述 输入一个整数n和一个整数p,你需要求出 \[\sum_{i=1}^n\sum_{j=1}^n (i\cdot j\cdot gcd(i,j))\ mod\ p\] ...
- LG3768 简单的数学题
P3768 简单的数学题 题目描述 输入一个整数n和一个整数p,你需要求出$(\sum_{i=1}^n\sum_{j=1}^n ijgcd(i,j))~mod~p$,其中gcd(a,b)表示a与b的最 ...
- 【数学】HPU--1037 一个简单的数学题
1037: 一个简单的数学题 [数学] 时间限制: 1 Sec 内存限制: 128 MB提交: 259 解决: 41 统计 题目描述 小明想要知道$a^b$的值,但是这个值会非常的大. 所以退而求其次 ...
- 洛谷 P3768 简单的数学题 解题报告
P3768 简单的数学题 题目描述 由于出题人懒得写背景了,题目还是简单一点好. 输入一个整数\(n\)和一个整数\(p,\)你需要求出\((\sum_{i=1}^n\sum_{j=1}^n ijgc ...
随机推荐
- 文件目录T位
场景: 共享目录设置T标志 可以看别人的文件,但不可以删除.修改别人的文件 除非是ROOT,目录的拥有者
- 【转载】使用阿里云code和git管理项目
使用代码云托管和git来管理项目可以使多客户端和多人开发更加高效.通过对比github,bitbucket和国内一些云托管服务发现阿里云在项目空间和传输速度及稳定性上更能满足公司开发的要求.本文将介绍 ...
- 发送邮件#Python
import yagmailusername='11@qq.com' #发件人邮箱qq='zhezlqiggd' #授权码,QQ邮箱可在设置账户获得mail_server='smtp.qq.com' ...
- mysql MVCC 实现原理
MVCC( Multi-Version Concurrency Controll) 每一行都存储了事件发生时的系统版本号(System Version Number),用来替代事件实际发生的时间.每一 ...
- 简析ThreadLocal原理及应用
简析ThreadLocal原理及应用 原创: 东晨雨 JAVA万维猿圈 4月17日 ThreadLocal的源码加上注释不超过八百行,源码结构清晰,代码也比较简洁.ThreadLocal可以说是Jav ...
- 学习SpringMVC 文件上传 遇到的问题,403:returned a response status of 403 Forbidden ,409文件夹未找到
问题一: 409:文件夹没有创建好,找不到指定的文件夹,创建了即可. 问题二: 403:returned a response status of 403 Forbidden 我出现这个错误的原因是因 ...
- npm和npx
npx 指令会先在项目的node_modules里面找资源包 npm info 包名称 [查看资源包的信息]
- JS垂直落体回弹原理
/* *JS垂直落体回弹原理 */ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...
- 组件公用数据 Vue.observable( )
注意(适合小项目,不用vuex的情况下使用) 1.创建store.js 最好和main.js平级创建文件 import Vue from 'vue' export const store = Vue. ...
- 蓝桥杯java 迷宫
0101010100101100100101011001011010010000100010101000001000100000101010010000100000001001100110100101 ...