题目描述

TTT组数据,给出NNN,MMM,求∑x=1N∑y=1Mlim(x,y)\sum_{x=1}^N\sum_{y=1}^M lim(x,y)\newlinex=1∑N​y=1∑M​lim(x,y)

N,M<=10000000T<=10000N,M <= 10000000\newline
T&lt;= 10000N,M<=10000000T<=10000

题目分析

直接开始变换,假设N<M

Ans=∑x=1N∑y=1Mxy(x,y)=∑T=1N1T∑x=1N∑y=1Mxy[(x,y)==T]=∑T=1N1T∑x=1⌊NT⌋∑y=1⌊MT⌋xyT2[(x,y)==1]=∑T=1NT∑x=1⌊NT⌋∑y=1⌊MT⌋xy∑d∣x,d∣yμ(d)=∑d=1Nμ(d)∑T=1NT∑d∣x⌊NT⌋x∑d∣y⌊MT⌋y=∑d=1Nμ(d)∑T=1NTd2∑x=1⌊⌊NT⌋d⌋x∑y=1⌊⌊MT⌋d⌋y=∑d=1Nμ(d)∑T=1NTd2∑x=1⌊NTd⌋x∑y=1⌊MTd⌋y此时令k=TdAns=∑k=1N∑T∣kμ(⌊kT⌋)k⌊kT⌋∑x=1⌊Nk⌋x∑y=1⌊Mk⌋y=∑k=1Nk∑T∣kμ(T)T∑x=1⌊Nk⌋x∑y=1⌊Mk⌋y
Ans=\sum_{x=1}^N\sum_{y=1}^M \frac {xy}{(x,y)}\newline
=\sum_{T=1}^N\frac 1T\sum_{x=1}^N\sum_{y=1}^Mxy[(x,y)==T]\newline
=\sum_{T=1}^N\frac 1T\sum_{x=1}^{⌊\frac NT⌋}\sum_{y=1}^{⌊\frac MT⌋}xyT^2[(x,y)==1]\newline
=\sum_{T=1}^NT\sum_{x=1}^{⌊\frac NT⌋}\sum_{y=1}^{⌊\frac MT⌋}xy\sum_{d|x,d|y}\mu(d)\newline
=\sum_{d=1}^N\mu(d)\sum_{T=1}^{N}T\sum_{d|x}^{⌊\frac NT⌋}x\sum_{d|y}^{⌊\frac MT⌋}y\newline
=\sum_{d=1}^N\mu(d)\sum_{T=1}^{N}Td^2\sum_{x=1}^{⌊\frac{⌊\frac NT⌋}d⌋}x\sum_{y=1}^{⌊\frac{⌊\frac MT⌋}d⌋}y\newline
=\sum_{d=1}^N\mu(d)\sum_{T=1}^{N}Td^2\sum_{x=1}^{⌊\frac N{Td}⌋}x\sum_{y=1}^{⌊\frac M{Td}⌋}y\newline
此时令k=Td\newline
Ans=\sum_{k=1}^N\sum_{T|k}\mu(⌊\frac kT⌋)k⌊\frac kT⌋\sum_{x=1}^{⌊\frac N{k}⌋}x\sum_{y=1}^{⌊\frac M{k}⌋}y\newline
=\sum_{k=1}^Nk\sum_{T|k}\mu(T)T\sum_{x=1}^{⌊\frac N{k}⌋}x\sum_{y=1}^{⌊\frac M{k}⌋}y\newline
Ans=x=1∑N​y=1∑M​(x,y)xy​=T=1∑N​T1​x=1∑N​y=1∑M​xy[(x,y)==T]=T=1∑N​T1​x=1∑⌊TN​⌋​y=1∑⌊TM​⌋​xyT2[(x,y)==1]=T=1∑N​Tx=1∑⌊TN​⌋​y=1∑⌊TM​⌋​xyd∣x,d∣y∑​μ(d)=d=1∑N​μ(d)T=1∑N​Td∣x∑⌊TN​⌋​xd∣y∑⌊TM​⌋​y=d=1∑N​μ(d)T=1∑N​Td2x=1∑⌊d⌊TN​⌋​⌋​xy=1∑⌊d⌊TM​⌋​⌋​y=d=1∑N​μ(d)T=1∑N​Td2x=1∑⌊TdN​⌋​xy=1∑⌊TdM​⌋​y此时令k=TdAns=k=1∑N​T∣k∑​μ(⌊Tk​⌋)k⌊Tk​⌋x=1∑⌊kN​⌋​xy=1∑⌊kM​⌋​y=k=1∑N​kT∣k∑​μ(T)Tx=1∑⌊kN​⌋​xy=1∑⌊kM​⌋​y

总算推完了…

此时只需要Θ(N)\Theta(N)Θ(N)线性筛出∑T∣kμ(T)T\sum_{T|k}\mu(T)T∑T∣k​μ(T)T,然后处理k∑T∣kμ(T)Tk\sum_{T|k}\mu(T)Tk∑T∣k​μ(T)T的前缀和

而∑x=1⌊Nk⌋x∑y=1⌊Mk⌋y\sum_{x=1}^{⌊\frac N{k}⌋}x\sum_{y=1}^{⌊\frac M{k}⌋}y∑x=1⌊kN​⌋​x∑y=1⌊kM​⌋​y可以Θ(1)\Theta(1)Θ(1)出

利用整除分块优化,时间复杂度为Θ(N+TN)\Theta(N+T\sqrt N)Θ(N+TN​)

AC code([bzoj 2693] jzptab)
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 10000005, mod = 1e8+9;
int N, M;
namespace Mobius
{
int mu[MAXN], Prime[MAXN], cnt;
bool IsnotPrime[MAXN];
int sum[MAXN];
void init()
{
sum[1] = 1;
for(int i = 2; i <= MAXN-5; i++)
{
if(!IsnotPrime[i]) Prime[++cnt] = i, sum[i] = 1-i;
for(int j = 1; j <= cnt && i * Prime[j] <= MAXN-5; j++)
{
IsnotPrime[i * Prime[j]] = 1;
if(i % Prime[j] == 0) { sum[i * Prime[j]] = sum[i]; break; }
sum[i * Prime[j]] = 1ll * sum[i] * (1 - Prime[j]) % mod;
}
}
for(int i = 1; i <= MAXN-5; i++)//前缀和
sum[i] = (sum[i-1] + 1ll*sum[i]*i%mod) % mod;
}
int Sum(int N, int M)
{
return ((1ll*N*(N+1)/2) % mod) * ((1ll*M*(M+1)/2) % mod) % mod;
}
int calc(int N, int M)
{
int ret = 0;
for(int i = 1, j; i <= N; i=j+1)//整除分块
{
j = min(N/(N/i), M/(M/i));
ret = (ret + 1ll * (sum[j] - sum[i-1]) % mod * Sum(N/i, M/i) % mod) % mod;
}
return ret;
}
}
using namespace Mobius;
int main ()
{
int T; init();
scanf("%d", &T);
while(T--)
{
scanf("%d%d", &N, &M); if(N > M) swap(N, M);
printf("%d\n", (calc(N, M) + mod) % mod);
}
}
AC code([bzoj 2154] Crash的数字表格)

这道题有个恶心的地方,不能用MaxnMaxnMaxn来预处理,否则会TLETLETLE,要读入NNN,MMM后再O(N)O(N)O(N)处理

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 10000005, mod = 20101009;
int N, M;
namespace Mobius
{
int mu[MAXN], Prime[MAXN], cnt;
bool IsnotPrime[MAXN];
int sum[MAXN];
void init()
{
sum[1] = 1;
for(int i = 2; i <= N; i++)
{
if(!IsnotPrime[i]) Prime[++cnt] = i, sum[i] = 1-i;
for(int j = 1; j <= cnt && i * Prime[j] <= N; j++)
{
IsnotPrime[i * Prime[j]] = 1;
if(i % Prime[j] == 0) { sum[i * Prime[j]] = sum[i]; break; }
sum[i * Prime[j]] = 1ll * sum[i] * (1 - Prime[j]) % mod;
}
}
for(int i = 1; i <= N; i++)
sum[i] = (sum[i-1] + 1ll*sum[i]*i%mod) % mod;
}
int Sum(int N, int M)
{
return ((1ll*N*(N+1)/2) % mod) * ((1ll*M*(M+1)/2) % mod) % mod;
}
int calc(int N, int M)
{
int ret = 0;
for(int i = 1, j; i <= N; i=j+1)
{
j = min(N/(N/i), M/(M/i));
ret = (ret + 1ll * (sum[j] - sum[i-1]) % mod * Sum(N/i, M/i) % mod) % mod;
}
return ret;
}
}
using namespace Mobius;
int main ()
{
scanf("%d%d", &N, &M); if(N > M) swap(N, M); init();
printf("%d\n", (calc(N, M) + mod) % mod);
}

[bzoj 2693] jzptab & [bzoj 2154] Crash的数字表格 (莫比乌斯反演)的更多相关文章

  1. [BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块)

    [BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块) 题面 求 \[\sum_{i=1}^{n} \sum_{j=1}^{m} \mathrm{lcm}(i,j)\] 分析 \[\su ...

  2. BZOJ 2154: Crash的数字表格 [莫比乌斯反演]

    2154: Crash的数字表格 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 2924  Solved: 1091[Submit][Status][ ...

  3. 【BZOJ】2154: Crash的数字表格 莫比乌斯反演

    [题意]给定n,m,求Σlcm(i,j),1<=i<=n,1<=j<=m,n,m<=10^7. [算法]数论(莫比乌斯反演) [题解] $$ans=\sum_{i\leq ...

  4. BZOJ 2154 Crash的数字表格 ——莫比乌斯反演

    求$\sum_{i=1}^n\sum_{j=1}^n lcm(i,j)$ 枚举因数 $ans=\sum_{d<=n} F(d) * d$ $F(d)$表示给定范围内两两$\sum_{gcd(i, ...

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

    题目描述 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时被a和b整除的最小正整数.例如,LCM(6, ...

  6. 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 ...

  7. 洛谷 - P1829 - Crash的数字表格 - 莫比乌斯反演

    求: \(S(n,m)=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}lcm(i,j)\) 显然: \(S(n,m)=\sum\limits_{i=1}^{n}\ ...

  8. [国家集训队] Crash的数字表格 - 莫比乌斯反演,整除分块

    考虑到\(lcm(i,j)=\frac{ij}{gcd(i,j)}\) \(\sum_{i=1}^n\sum_{j=1}^m\frac{ij}{gcd(i,j)}\) \(\sum_{d=1}^{n} ...

  9. 【莫比乌斯反演】关于Mobius反演与lcm的一些关系与问题简化(BZOJ 2154 crash的数字表格&&BZOJ 2693 jzptab)

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

随机推荐

  1. Quartz.Net—Calendar

    动态的排除一些触发器的时间. DailyCalendar-天日历 定义: This implementation of the Calendar excludes (or includes - see ...

  2. Nio学习笔记(大部分网上摘抄)

    Nio与IO的区别 原有的 IO 是面向流的.阻塞的,NIO 则是面向块的.非阻塞的. 1.IO流每次从流中读一个或多个字节,直至读完所有字节,他们没有被缓存在其他地方,并且,IO流不能移动流中的数据 ...

  3. Mybatis笔记1

    Mybatis 持久层框架,数据访问层 mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动,创建连接,创建sta ...

  4. Android持久化存储——(包含操作SQLite数据库)

    <第一行代码>读书手札 你可能会遇到的问题:解决File Explorer 中无显示问题 Android中,持久化存储,常见的一共有三种方法实现 (一.)利用文件存储 文件存储是Andro ...

  5. BJFU-207-基于顺序存储结构的图书信息表的逆序存储

    #include<stdio.h> #include<stdlib.h> #define MAX 1000 typedef struct{ double no; char na ...

  6. k8s开发实践

    代码自动生成:https://blog.openshift.com/kubernetes-deep-dive-code-generation-customresources/ 自定义controlle ...

  7. 5-24 c++语言之【基础知识】

    最近一段时间继续开始了c++的学习,作为c plus plus 难免会与c语言做一个对比,很明显的感受到c++语言注重代码的复用性和拓展性,而c语言更加注重其算法的高效性,这也是今后需要注意的地方,避 ...

  8. js array 排序

    数据 let data = [ {chinese: '蔡司', english: 'Chase',score:67}, {chinese: '艾伦', english: 'Allen',score:7 ...

  9. 在vue项目中使用live2d

    成品如图: 那么几步简单说明怎么用吧: 第一,先去github上下载相应的静态资源: https://github.com/xiazeyu/live2d-widget-models 第二,将packg ...

  10. SEO运用meta标签进行网站优化

    SEO定义 Search Engine Optimization 搜索引擎优化 一,常用的HTTP-EQUIV类型: Set-Cookie(cookie设定) 说明:如果网页过期,存盘的cookie将 ...