题意:求sigma{lcm(i,j)},1<=i<=n,1<=j<=m

不妨令n<=m

首先把lcm(i,j)转成i*j/gcd(i,j)

正解不会...总之最后化出来的莫比乌斯反演式子并没有除法…

本脑子有坑选手的做法:20101009是一个质数,而且n和m的范围小于20101009,这一定有其原因。经过仔细思考,我们发现这保证了每个1~n的数都有mod20101009意义下的乘法逆元。用inv[x]表示x的逆元,我们发现原先的式子等于sigma{inv[gcd(i,j)]*i*j},1<=i<=n,1<=j<=m

于是我们枚举g=gcd(i,j)则原式等于sigma{inv[g]*H(g)},1<=g<=n

H(g)=sigma{i*j},1<=i<=n,1<=j<=m,gcd(i,j)==g.

定义h(g)= sigma{i*j},1<=i<=n,1<=j<=m,g|gcd(i,j),我们发现,h(g)可以方便地求出,且h(g)是H(g)的倍数和,这启发我们使用莫比乌斯反演,H(g)=sigma{mu(q/g)*h(q)},g|q,1<=q<=n接下来我们将式子变形为先枚举q,则原式=sigma{h(q)*sigma{inv[g]*mu(q/g),g|q}}1<=q<=n

我们知道莫比乌斯函数和乘法逆元都是积性函数,积性函数的积,积性函数的约数和也是积性函数,这启发我们用线性筛预处理G(q)=sigma{inv[g]*mu(q/g),g|q}!接下来暴力枚举q即可。

而1-n所有数的逆元也有线性的方法可以求出,

综上,我们得到了一个时空复杂度均为O(n)的优越算法(大雾)。

然而常数大,T得飞起….

#include<cstdio>
#include<ctime>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=;const ll mod=;
int niyuan[maxn];
bool flag[maxn];
int prime[maxn/],mu[maxn],f[maxn],h[maxn],g[maxn],tot;
void linear(){
niyuan[]=;f[]=;
// for(int i=2;i<maxn;++i)niyuan[i]=niyuan[mod%i]*niyuan[mod%i]%mod*(mod/i)%mod*(mod/i)%mod*i%mod;//常数已炸天,0.6s+
int tmp;
for(int i=,last;i<maxn;i=last+){
last=mod/(mod/i);
tmp=mod/i;tmp=tmp*1LL*tmp%mod;
for(int j=i;j<=last&&j<maxn;++j)niyuan[j]=niyuan[mod%j]*1LL*niyuan[mod%j]%mod*tmp*j%mod;
}
mu[]=;
for(int i=;i<maxn;++i){
if(!flag[i]){
prime[++tot]=i;mu[i]=-;
f[i]=mu[i]+niyuan[i];h[i]=i;g[i]=;
}
for(int j=;j<=tot&&prime[j]*i<maxn;++j){
tmp=i*prime[j];
flag[tmp]=true;
if(i%prime[j]==){
mu[tmp]=;
g[tmp]=g[i];
h[tmp]=h[i]*1LL*prime[j]%mod;
f[tmp]=f[g[i]]*1LL*(niyuan[h[i]*1LL*prime[j]%mod]-niyuan[h[i]]+mod)%mod;
break;
}else{
mu[tmp]=-mu[i];
h[tmp]=prime[j];
g[tmp]=i;
f[tmp]=f[i]*1LL*f[prime[j]]%mod;
}
}
}
}
int n,m;
ll f2(ll x){
ll a=n/x,b=m/x;
return a*(a+)%mod*b%mod*(b+)%mod*niyuan[]%mod*x*x%mod;
}
int solve(){
if(n>m)swap(n,m);
int ans=;
for(int d=;d<=n;++d){
ans=ans+f2(d)*f[d]%mod;ans%=mod;
}
return ans;
}
int main(){
linear();
scanf("%d%d",&n,&m);
printf("%d\n",solve());
return ;
}

UPD:线性筛改成筛到min(n,m)而不是筛到maxn,因为小数据比较多,按总时限在bzoj卡过去了,感人肺腑(虽然极限数据的单点时限还是会T)

(有个数组开longlong结果MLE了)

Bzoj2154 Crash的数字表格 乘法逆元+莫比乌斯反演(TLE)的更多相关文章

  1. 【题解】Crash的数字表格 BZOJ 2154 莫比乌斯反演

    题目传送门 http://www.lydsy.com/JudgeOnline/problem.php?id=2154 人生中第一道自己做出来的莫比乌斯反演 人生中第一篇用LaTeX写数学公式的博客 大 ...

  2. [luogu1829][bzoj2154][国家集训队]Crash的数字表格 / JZPTAB【莫比乌斯反演】

    传送门:洛谷,bzoj 题目描述 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时整除a和b的最小正整 ...

  3. 洛谷P1829 [国家集训队]Crash的数字表格 / JZPTAB(莫比乌斯反演)

    传送门 式子好麻烦orz……大佬好腻害orz->这里 //minamoto #include<iostream> #include<cstdio> #define ll ...

  4. 洛谷 P1829 [国家集训队]Crash的数字表格 / JZPTAB(莫比乌斯反演)

    题意:求$\sum_{i=1}^{n}\sum_{j=1}^{m}lcm(i,j)$. 开始开心(自闭)化简: $\sum_{i=1}^{n}\sum_{j=1}^{m}lcm(i,j)$ =$\su ...

  5. BZOJ2154 Crash的数字表格 【莫比乌斯反演】

    BZOJ2154 Crash的数字表格 Description 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b) ...

  6. 【莫比乌斯反演】BZOJ2154 Crash的数字表格

    Description 求sigma lcm(x,y),x<=n,y<=m.n,m<=1e7. Solution lcm没有什么直接做的好方法,用lcm=x*y/gcd转成gcd来做 ...

  7. BZOJ2154: Crash的数字表格 & BZOJ2693: jzptab

    [传送门:BZOJ2154&BZOJ2693] 简要题意: 给出n,m,求$\sum_{i=1}^{n}\sum_{j=1}^{m}LCM(i,j)$ 题解: 莫比乌斯反演(因为BZOJ269 ...

  8. bzoj2154: Crash的数字表格 莫比乌斯反演

    题意:求\(\sum_{i=1}^n \sum_{j=1}^m\frac{i*j}{gcd(i,j)}\) 题解:\(ans=\sum_{i=1}^n\sum_{j=1}^m \frac{i*j}{g ...

  9. 莫比乌斯反演套路三、四--BZOJ2154: Crash的数字表格 && BZOJ2693: jzptab

    t<=1e4个询问每次问n,m<=1e7,$\sum_{1\leqslant x \leqslant n,1 \leqslant y\leqslant m}lcm(x,y)$. 首先题目要 ...

随机推荐

  1. C#:枚举

    1. 枚举的综合运用 public enum Color { yellow, blue, green } class Program { static void Main(string[] args) ...

  2. typedef 和 #define 的区别

    本文已迁移至: http://www.danfengcao.info/c/c++/2014/02/25/difference-between-define-and-typedef.html typed ...

  3. oracle数据库rman备份计划及恢复

    1.rman完全恢复的前提条件:历史的datafile,controlfile和spfile备份,加上完整的archivelog和完好的redolog. 2.rman备份脚本: a.RMAN 0级备份 ...

  4. 在C#中该如何阻止虚方法的覆写

    在开发过程中,我们为了让一个类更有生命力,有时会用virtual来修饰一个方法好让子类来覆写它.但是如果有更新的子子类来覆写时,我们又不想让其影响到上一层的覆写,这时候就要用到new virtual来 ...

  5. (转)浅析Java中的访问权限控制

    原文地址: http://www.cnblogs.com/dolphin0520/p/3734915.html 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下 ...

  6. Linux吃掉我的内存

    在Windows下资源管理器查看内存使用的情况,如果使用率达到80%以上,再运行大程序就能感觉到系统不流畅了,因为在内存紧缺的情况下使用交换分区,频繁地从磁盘上换入换出页会极大地影响系统的性能.而当我 ...

  7. windows 环境下的redis安装

    Redis安装 1.由于是练习,所以就在windows下安装的环境,并没有在LINUX服务器上装,但是知识点是一样的 安装流程: a.下载地址:https://github.com/MSOpenTec ...

  8. Java — JTree and JTable以及sqlServer的两种连接

    使用JTree的步骤: 暂时只能创建一个头结点,创建一个树的结点作为头结点(其子结点也是相同的创建方法):DefaultMutableTreeNode headNode = new DefaultMu ...

  9. mysql utf8编码

    做微信项目,报错 "Incorrect string value: '\\xF0\\x9F\\x98\\x8B' for column 'nickname' at row 1" 原 ...

  10. .NET定时任务执行管理器开源组件–FluentScheduler

    在日常项目里通常会遇到定时执行任务的需求,也就是定时器..NET Framework里关于定时器的类有3个,分别是System.Windows.Forms.Timer.System.Timers.Ti ...