原文链接http://www.cnblogs.com/zhouzhendong/p/8116330.html

UPD(2018-03-26):回来重新学数论啦。之前的博客版面放在更新之后的后面。


题目传送门 - BZOJ3561


题意概括

  给出$n,m$,求$\Large\sum_{i=1}^n\sum_{j=1}^m lcm(i,j)^{\gcd(i, j)}$。

  $1\leq n,m\leq 500000$

题解

  先推式子:(假设$n\leq m$)

  $$\sum_{i=1}^n\sum_{j=1}^m lcm(i,j)^{\gcd(i, j)}\\=\sum_{d=1}^{n}\sum_{i=1}^{\left\lfloor\frac nd\right\rfloor}\sum_{j=1}^{\left\lfloor\frac md\right\rfloor}(ijd)^d\cdot[\gcd(i,j)=1]\\=\sum_{d=1}^{n}\sum_{i=1}^{\left\lfloor\frac nd\right\rfloor}\sum_{j=1}^{\left\lfloor\frac md\right\rfloor}(ijd)^d\cdot\sum_{p|i,p|j}\mu(p)\\=\sum_{d=1}^{n}d^{d}\sum_{p=1}^{\left\lfloor\frac nd\right\rfloor}\mu(p)\sum_{i=1}^{\left\lfloor\frac{n}{pd}\right\rfloor}\sum_{j=1}^{\left\lfloor\frac{m}{pd}\right\rfloor}(ijp^2)^d\\=\sum_{d=1}^{n}d^{d}\sum_{p=1}^{\left\lfloor\frac nd\right\rfloor}\mu(p)p^{2d}\sum_{i=1}^{\left\lfloor\frac {n}{pd}\right\rfloor}i^d\sum_{j=1}^{\left\lfloor\frac{m}{pd}\right\rfloor}j^d$$

  然后发现对于$d^d$可以直接快速幂。对于某一个$d$,要枚举的$p$有$O(\frac nd)$个,对于后面的一堆数的幂和,只要前缀和预处理,要处理的个数也是$O(\frac md)$的。所以总复杂度为$O(n \log n)$。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=500005;
const LL mod=1e9+7;
int n,m,prime[N],u[N],pcnt=0;
bool f[N];
void init(int n){
memset(f,true,sizeof f);
f[0]=f[1]=0,u[1]=1;
for (int i=2;i<=n;i++){
if (f[i])
prime[++pcnt]=i,u[i]=-1;
for (int j=1;j<=pcnt&&i*prime[j]<=n;j++){
f[i*prime[j]]=0;
if (i%prime[j])
u[i*prime[j]]=-u[i];
else {
u[i*prime[j]]=0;
break;
}
}
}
}
LL Pow(LL x,LL y){
if (!y)
return 1LL;
LL xx=Pow(x,y/2);
xx=xx*xx%mod;
if (y&1LL)
xx=xx*x%mod;
return xx;
}
LL pows[N],sum[N];
int main(){
scanf("%d%d",&n,&m);
if (n>m)
swap(n,m);
init(n);
for (int i=1;i<=m;i++)
pows[i]=1;
LL ans=0;
for (int d=1;d<=n;d++){
LL now=0;
sum[0]=0;
for (int i=1;i<=m/d;i++)
pows[i]=pows[i]*i%mod,sum[i]=(sum[i-1]+pows[i])%mod;
for (int p=1;p<=n/d;p++)
now=(now+u[p]*pows[p]*pows[p]%mod*sum[n/p/d]%mod*sum[m/p/d])%mod;
now=(now%mod+mod)%mod;
ans=(ans+Pow(d,d)*now)%mod;
}
printf("%lld",ans);
return 0;
}

  

——————old——————

题意概括

给定正整数n,m。求
 

题解

博主越来越懒了。

http://blog.csdn.net/lych_cys/article/details/50721642?locationNum=1&fps=1


代码

#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long LL;
const int N=500005;
const LL mod=1e9+7;
LL n,m,u[N],prime[N],pcnt,v[N],sum[N];
bool isprime[N];
LL Pow(LL x,LL y){
if (y==0)
return 1LL;
LL xx=Pow(x,y/2);
xx=xx*xx%mod;
if (y&1LL)
xx=xx*x%mod;
return xx;
}
void Get_Mobius(){
memset(isprime,true,sizeof isprime);
isprime[0]=isprime[1]=pcnt=0;
u[1]=1;
for (LL i=2;i<=n;i++){
if (isprime[i])
u[i]=-1,prime[++pcnt]=i;
for (LL j=1;j<=pcnt&&i*prime[j]<=n;j++){
isprime[i*prime[j]]=0;
if (i%prime[j])
u[i*prime[j]]=-u[i];
else {
u[i*prime[j]]=0;
break;
}
}
}
}
int main(){
scanf("%lld%lld",&n,&m);
if (n<m)
swap(n,m);
Get_Mobius();
for (int i=1;i<=n;i++)
v[i]=1;
LL ans=0;
for (LL d=1;d<=m;d++){
sum[0]=0;
for (LL i=1;i<=(LL)(n/d);i++)
v[i]=v[i]*i%mod,sum[i]=(v[i]+sum[i-1])%mod;
LL res=0;
for (LL p=1;p<=(LL)(m/d);p++)
res=(res+v[p]*v[p]%mod*u[p]*sum[n/d/p]%mod*sum[m/d/p]%mod+mod)%mod;
ans=(ans+res*Pow(d,d))%mod;
}
printf("%lld",ans);
return 0;
}

  

BZOJ3561 DZY Loves Math VI 数论 快速幂 莫比乌斯反演的更多相关文章

  1. BZOJ3560 DZY Loves Math V 数论 快速幂

    原文链接http://www.cnblogs.com/zhouzhendong/p/8111725.html UPD(2018-03-26):蒟蒻回来重新学数论了.更新了题解和代码.之前的怼到后面去了 ...

  2. [BZOJ3561] DZY Loves Math VI

    (14.10.28改) 本来只想写BZOJ3739:DZY Loves Math VIII的,不过因为和VI有关系,而且也没别人写过VI的题解,那么写下. 不过我还不会插公式…… http://www ...

  3. BZOJ3561 DZY Loves Math VI 莫比乌斯反演

    传送门 看到\(gcd\)相关先推式子(默认\(N \leq M\)): \(\begin{align*} \sum\limits_{i=1}^N \sum\limits_{j=1}^M (lcm(i ...

  4. BZOJ3561 DZY Loves Math VI 【莫比乌斯反演】

    题目 给定正整数n,m.求 输入格式 一行两个整数n,m. 输出格式 一个整数,为答案模1000000007后的值. 输入样例 5 4 输出样例 424 提示 数据规模: 1<=n,m<= ...

  5. 【BZOJ3561】DZY Loves Math VI (数论)

    [BZOJ3561]DZY Loves Math VI (数论) 题面 BZOJ 题解 \[\begin{aligned} ans&=\sum_{i=1}^n\sum_{j=1}^m\sum_ ...

  6. 【BZOJ 3561】 3561: DZY Loves Math VI (莫比乌斯,均摊log)

    3561: DZY Loves Math VI Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 205  Solved: 141 Description ...

  7. BZOJ 3561 DZY Loves Math VI

    BZOJ 3561 DZY Loves Math VI 求\(\sum_{i=1}^{n}\sum_{j=1}^{m}\text{lcm}(i,j)^{\gcd(i,j)}\),钦定\(n\leq m ...

  8. 【bzoj3561】DZY Loves Math VI 莫比乌斯反演

    题目描述 给定正整数n,m.求   输入 一行两个整数n,m. 输出 一个整数,为答案模1000000007后的值. 样例输入 5 4 样例输出 424 题解 莫比乌斯反演 (为了方便,以下公式默认$ ...

  9. 【BZOJ】3561: DZY Loves Math VI

    题意 求\(\sum_{i=1}^{n} \sum_{j=1}^{m} lcm(i, j)^{gcd(i, j)}\)(\(n, m<=500000\)) 分析 很显然要死推莫比乌斯 题解 设\ ...

随机推荐

  1. PyJWT 使用

    最近要用 Falsk 开发一个大点的后端,为了安全考虑,弃用传统的Cookie验证.转用JWT. 其实 Falsk 有一个 Falsk-JWT 但是我觉得封装的太高,还是喜欢通用的 PyJWT . J ...

  2. pip的常用命令

    前言 pip作为Python的御用包管理工具有着强大的功能,但是许多命令需要我们使用的时候借助搜索引擎查找(尤其是我), 于是我想将我使用到的命令整合下来,以后不用麻烦去找了,也希望能给你带来帮助.文 ...

  3. 解决KafKa数据存储与顺序一致性保证

    “严格的顺序消费”有多么困难 下面就从3个方面来分析一下,对于一个消息中间件来说,”严格的顺序消费”有多么困难,或者说不可能. 发送端 发送端不能异步发送,异步发送在发送失败的情况下,就没办法保证消息 ...

  4. Oracle管理文件OMF (oracle managed files)

    简化dba的管理操作 1:启用 omf 23:16:04 SYS@orcl> show parameter DB_CREATE_FILE_DEST NAME TYPE VALUE ------- ...

  5. LeetCode(106):从中序与后序遍历序列构造二叉树

    Medium! 题目描述: 根据一棵树的中序遍历与后序遍历构造二叉树. 注意:你可以假设树中没有重复的元素. 例如,给出 中序遍历 inorder = [9,3,15,20,7] 后序遍历 posto ...

  6. mysql中有多种存储引擎,每种引擎都有自己的特色

    mysql中有多种存储引擎,每种引擎都有自己的特色. 用途: MyISAM:快读, Memory:内存数据, InnoDB:完整的事务支持 锁: MyISAM:全表锁定, Memory:全表锁定, I ...

  7. bzoj3991 lca+dfs序应用+set综合应用

    /* 给定一棵树,树上会出现宝物,也会有宝物消失 规定如果要收集树上所有宝物,就要选择一个点开始,到每个宝物点都跑一次,然后再回到那个点 现在给定m次修改,每次修改后树上就有一个宝物消失,或者一个宝物 ...

  8. poj2942 求v-DCC,二分图判奇环,补图

    /* 给定一张无向图,求有多少点不被任何奇环包含 推论1:如果两个点属于两个不同的v-DCC,则他们不可能在同一个奇环内 推论2:某个v-DCC中有奇环,则这个v-DCC中所有点必定被属于某个奇环 只 ...

  9. hdu4276 依赖背包

    网上题解都是用spfa求1-n路径的,但其实dfs一次就可以了.. #include <iostream> #include <cstdio> #include <str ...

  10. mysql 文件导入

    load data infile 文件路径 into table 表 fields terminated by ',' lines terminated '\n'