[题解] 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 ...
随机推荐
- ToString 奇淫技巧
int和float同样结果 decimal decTemp = 2.1m; Console.WriteLine(decTemp.ToString("#0.00")); //输出2. ...
- Linux三剑客之awk精讲(基础与进阶)
第1章 awk基础入门 要弄懂awk程序,必须熟悉了解这个工具的规则.本实战笔记的目的是通过实际案例或面试题带同学们熟练掌握awk在企业中的用法,而不是awk程序的帮助手册. 1.1 awk简介 一种 ...
- mybatis利用generator自动生成的代码
/** * 排序规则 */ protected String orderByClause; /** * 去重规则 */ protected boolean distinct; /** * where条 ...
- redis 之redis集群与集群配置
一.为什么要用集群 redis3.0集群采用P2P模式,完全去中心化,将redis所有的key分成了16384个槽位,每个redis实例负责一部分slot,集群中的所有信息通过节点数据交换而更新. r ...
- 微信红包系统设计 & 优化
微信红包系统设计 & 优化 浏览次数:151次 腾讯大讲堂 2015年04月02日 字号: 大 中 小 分享到:QQ空间新浪微博腾讯微博人人网豆瓣网开心网更多0 编者按:经过2014年一年 ...
- “嘭、嘭、嘭”---C/S架构下的心跳机制
本人想使用AU3开发多客户端.一服务端.需要使用到心跳机制,即 在线状态实时更新以及掉线自动重连. 搜索网络发现没有人用AU3写心跳机制. 下面是一篇转帖(原文地址:http://www.cnblog ...
- 输出复选框选中的文件名 checkbox
1. <tr> <td><input type="checkbox" name="cbxFileName"/> ...
- 多个span标签在同一行显示
属性设置为display:inline或display:inline-block
- Linux命令(1)
cd <directory> Short for "change directory". The shorthand name for the current dire ...
- HBase基准测试
执行命令: hbase org.apache.hadoop.hbase.PerformanceEvaluation 返回信息: [root@node1 /]# hbase org.apache.had ...