BZOJ3309 DZY Loves Math 【莫比乌斯反演】
题目
对于正整数n,定义f(n)为n所含质因子的最大幂指数。例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0。
给定正整数a,b,求sigma(sigma(f(gcd(i,j)))) (i=1..a, j=1..b)。
输入格式
第一行一个数T,表示询问数。
接下来T行,每行两个数a,b,表示一个询问。
输出格式
对于每一个询问,输出一行一个非负整数作为回答。
输入样例
4
7558588 9653114
6514903 4451211
7425644 1189442
6335198 4957
输出样例
35793453939901
14225956593420
4332838845846
15400094813
提示
【数据规模】
T<=10000
1<=a,b<=10^7
题解
前面的推导很套路:
\]
\]
\]
\]
后面那玩意\(g(T) = \sum\limits_{d|T} f[d] * \mu(\frac{T}{d})\)如果能预处理出来,就能\(O(T\sqrt{n})\)计算了
然后我只会\(O(nlogn)\),,,,
去膜题解
要利用\(\mu(i)\)的性质
显然\(i\)有平方项就不用考虑了
所以\(T = \prod\limits_{i = 1}^{k} p_i^{a_i}\)中每个\(a_i\)最多被取掉\(1\)
设最大为\(r\)
所以\(f(d) = r\)或\(r - 1\)
我们设有\(x\)个这样的指数为\(r\),那么剩余的\(k - x\)个质因子的指数就可以任选,有\(2^{k - x}\)中选法
如果\(k \ne x\),\(2^{k - x}\)为偶数,对应\(\mu\)的正负数量相等,最后和为\(0\)
所以只有\(k = x\)时,\(g(T) \ne 0\)
否则我们假使所有的\(f(d)\)都等于\(r\),那么和依旧为\(0\),但是实际上当\(k\)个数都被选的时候\(f(d) = r - 1\),多了一个\(-1\),根据奇偶性,最后会产生\((-1)^{k + 1}\)的贡献
所以此时\(g(T) = (-1)^{k + 1}\)
具体可以先筛出\(\mu(i)\),再由\(\mu(i) \ne 0\)的\(i\)推出所有的\(f(i^x)\),这样做每个数只会被推一次,所以是\(O(n)\)的
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define LL long long int
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define BUG(s,n) for (int i = 1; i <= (n); i++) cout<<s[i]<<' '; puts("");
using namespace std;
const int maxn = 10000005,maxm = 100005,N = 1e7,INF = 1000000000;
inline int read(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}
while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
return out * flag;
}
int p[maxn],pi,isn[maxn],mu[maxn];
LL g[maxn];
void init(){
mu[1] = 1;
for (int i = 2; i <= N; i++){
if (!isn[i]) p[++pi] = i,mu[i] = -1;
for (int j = 1; j <= pi && i * p[j] <= N; j++){
isn[i * p[j]] = true;
if (i % p[j] == 0){
mu[i * p[j]] = 0;
break;
}
mu[i * p[j]] = -mu[i];
}
}
for (LL i = 2; i <= N; i++)
if (mu[i] != 0){
for (LL j = i,t = -mu[i]; j <= N; j *= i)
g[j] = t;
}
for (int i = 1; i <= N; i++) g[i] += g[i - 1];
}
int main(){
init();
int T = read(),n,m;
LL ans;
while (T--){
n = read(); m = read(); ans = 0;
if (n > m) swap(n,m);
for (int i = 1,nxt; i <= n; i = nxt + 1){
nxt = min(n / (n / i),m / (m / i));
ans += 1ll * (n / i) * (m / i) * (g[nxt] - g[i - 1]);
}
printf("%lld\n",ans);
}
return 0;
}
BZOJ3309 DZY Loves Math 【莫比乌斯反演】的更多相关文章
- [BZOJ3309]DZY Loves Math(莫比乌斯反演+线性筛)
$\sum\limits_{T=1}^{n}\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor\sum\limits_{d|T}f(d)\mu(\fr ...
- 【BZOJ3309】DZY Loves Math 莫比乌斯反演+线性筛(好题)
[BZOJ3309]DZY Loves Math Description 对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10 ...
- 【BZOJ】3309: DZY Loves Math 莫比乌斯反演优化
3309: DZY Loves Math Description 对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007) ...
- bzoj 3309 DZY Loves Math 莫比乌斯反演
DZY Loves Math Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1303 Solved: 819[Submit][Status][Dis ...
- 【BZOJ3309】DZY Loves Math - 莫比乌斯反演
题意: 对于正整数n,定义$f(n)$为$n$所含质因子的最大幂指数.例如$f(1960)=f(2^3 * 5^1 * 7^2)=3$,$f(10007)=1$,$f(1)=0$. 给定正整数$a,b ...
- 【bzoj3309】DZY Loves Math 莫比乌斯反演+线性筛
Description 对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0. 给定正整数a,b, ...
- BZOJ 3309 DZY Loves Math ——莫比乌斯反演
枚举$d=gcd(i,j)$ 然后大力反演 ——来自Popoqqq的博客. 然后大力讨论后面的函数的意义即可. http://blog.csdn.net/popoqqq/article/details ...
- BZOJ 3309: DZY Loves Math [莫比乌斯反演 线性筛]
题意:\(f(n)\)为n的质因子分解中的最大幂指数,求\(\sum_{i=1}^n \sum_{j=1}^m f(gcd(i,j))\) 套路推♂倒 \[ \sum_{D=1}^n \sum_{d| ...
- BZOJ3309 DZY Loves Maths 莫比乌斯反演、线性筛
传送门 推式子(默认\(N \leq M\)): \(\begin{align*} \sum\limits_{i=1}^N \sum\limits_{j=1}^Mf(gcd(i,j)) & = ...
- bzoj 3309 DZY Loves Math —— 莫比乌斯反演+数论分块
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3309 凭着上课所讲和与 Narh 讨论推出式子来: 竟然是第一次写数论分块!所以迷惑了半天: ...
随机推荐
- jquery iCheck 插件
1 官网:http://www.bootcss.com/p/icheck/#download 2 博客:https://www.cnblogs.com/xcsn/p/6307610.html http ...
- java基础——线程池
第2章 线程池 2.1 线程池概念 线程池,其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源. 我们详细的解释一下为什么要使用线程池 ...
- 巧妙使用JQuery Clone 添加多行数据,并更新到数据库
WEB代码: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="BatchAdd. ...
- opencv anaconda
from: http://blog.csdn.net/fairylrt/article/details/43560525 Anaconda是一个python的一个包装,或者不单单是这样.你可以认为An ...
- vscode wepy 用户自定义代码片段
VSCode wepy 自定义代码片段 { "wepy-page": { "prefix": "wepy", "body" ...
- 快速搭建lvs + keepalived + nginx
环境: VIP 192.168.2.224 LVS 192.168.2.217 centos7 nginx1 192.168.2.231 c ...
- Vue2+webpack+node 配置+入门+详解
Vue2介绍 1.vue2.0 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架. Vue 的核心库只关注视图层 采用单文件组件 复杂大型单页应用程序(SPA) 响 ...
- Fakeapp 入门教程(3):参数篇
参数可以让软件自由度更高.Fakeapp的参数并不算多,但是也非常使用.本文就讲解下几个重要的参数.参数设置界面可以通过点击SETTINGS打开. 参数修改无需点击保存,一旦修改直接生效. Proce ...
- php中处理字符串的常见函数
编写程序的时候,经常要处理字符串,最基本就是字符串的查找,在php检测字符串中是否包含指定字符串可以使用正则,如果你对正则不了解,那么有几个函数可以为您提供方便. 1. strstr strstr() ...
- 用描述符实现缓存功能和property实现原理
class Lazyproperty: def __init__(self, func): self.func = func def __get__(self, instance, owner): p ...