BZOJ 3309: DZY Loves Math
3309: DZY Loves Math
Time Limit: 20 Sec Memory Limit: 512 MB
Submit: 761 Solved: 401
[Submit][Status][Discuss]
Description
对于正整数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)。
Input
第一行一个数T,表示询问数。
接下来T行,每行两个数a,b,表示一个询问。
Output
对于每一个询问,输出一行一个非负整数作为回答。
Sample Input
10000
7558588 9653114
6514903 4451211
7425644 1189442
6335198 4957
Sample Output
14225956593420
4332838845846
15400094813
HINT
【数据规模】
T<=10000
1<=a,b<=10^7
Source
分析:
还是莫比乌斯反演...然而公式还是很好推...都是套路...但是我不会求f(i)TAT...
Σ(1<=i<=n) Σ(1<=j<=m) f(gcd(i,j)) 依旧令n<=m
=Σ(1<=i<=n) Σ(i|j&&j<=n) μ(j/i)*(n/j)*(m/j)
=Σ(1<=j<=n) (n/j)*(m/j) Σ(i|j) f(i)*μ(j/i)
看ij不顺眼...还是换成x和d吧...
=Σ(1<=x<=n) (n/x)*(m/x) Σ(d|x) f(d)*μ(x/d)
然后怎么办,用树状数组维护前缀和??感觉还是会T的很惨...直觉告诉我这题复杂度绝对是T*(sqrt(n)+sqrt(m))的......
再仔细分析一下:
我们发现当x/d存在平方因子也就是f(x/d)>1的时候μ(x/d)=0...
但是x和d是分不开的...质因数分解一下??
x=p1^a1*p2^a2*p3^a3*......*pt^at
d=p1^b1*p2^b2*p3^b3*......*pt^bt
然后呢?额,还是借鉴了一下别人的代码TAT...
因为μ函数改变了f的正负,所以有些东西可以相消,所以我们可以发现对于x的a数组可以分为以下两种情况:
No.1
不存在ai≠aj,那么当前x对ans做出的贡献就是(-1)^(t+1)
证明如下:
当f有贡献的时候当且仅当μ不为0,也就是说如果设ai=aj=a,那么当且仅当f(d)=a||a-1的时候,首先考虑f(d)=a-1的时候:
只有一种情况就是所有的质因子次数都去a-1的时候,此时ans+=(a-1)*(-1)^t...
当f(d)=a的时候,那么对ans的贡献就是a*((-1)^0*C(t,0)+(-1)^1*C(t,1)+......+(-1)^(t-1)*C(t,t-1))
根据杨辉三角我们可以得到这个式子的结果是a*(-1)^(t+1)...
那么加起来ans=(-1)^(t+1)
No.2
存在ai≠aj的时候,根据组合数组合一下就可以发现加起来成了0(懒得证了...自己推一推吧...)
也就是说我们只需要计算ai=aj=a的时候的(-1)^(t+1),这个问题就可以在线性筛的时候解决...
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
//by NeighThorn
using namespace std;
//大鹏一日同风起,扶摇直上九万里 const int maxn=+; int a,b,cas,cnt,f[maxn],num[maxn],vis[maxn],lala[maxn],prime[maxn]; long long ans; signed main(void){
cnt=;
for(int i=;i<=;i++){
if(!vis[i])
prime[++cnt]=i,lala[i]=num[i]=,f[i]=;
for(int j=;j<=cnt&&i*prime[j]<=;j++){
int x=i*prime[j];vis[x]=;
if(i%prime[j]==){
lala[x]=lala[i];num[x]=num[i]+;
if(lala[i]==)
f[x]=;
else
f[x]=(num[lala[x]]==num[x]?-f[lala[x]]:);
break;
}
lala[x]=i,num[x]=,f[x]=(num[i]==?-f[i]:);
}
}
for(int i=;i<=;i++)
f[i]+=f[i-];
scanf("%d",&cas);
while(cas--){
scanf("%d%d",&a,&b);
if(a>b)
swap(a,b);
ans=;
for(int i=,r;i<=a;i=r+){
r=min(a/(a/i),b/(b/i));
ans+=(long long)(f[r]-f[i-])*(a/i)*(b/i);
}
printf("%lld\n",ans);
}
return ;
}//Cap ou pas cap. Cap.
By NeighThorn
BZOJ 3309: DZY Loves Math的更多相关文章
- ●BZOJ 3309 DZY Loves Math
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3309 题解: 莫比乌斯反演,线筛 化一化式子: f(x)表示x的质因子分解中的最大幂指数 $ ...
- bzoj 3309 DZY Loves Math 莫比乌斯反演
DZY Loves Math Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1303 Solved: 819[Submit][Status][Dis ...
- bzoj 3309 DZY Loves Math——反演+线性筛
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3309 像这种数据范围,一般是线性预处理,每个询问 sqrt (数论分块)做. 先反演一番.然 ...
- bzoj 3309 DZY Loves Math —— 莫比乌斯反演+数论分块
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3309 凭着上课所讲和与 Narh 讨论推出式子来: 竟然是第一次写数论分块!所以迷惑了半天: ...
- 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| ...
- BZOJ 3309 DZY Loves Math ——莫比乌斯反演
枚举$d=gcd(i,j)$ 然后大力反演 ——来自Popoqqq的博客. 然后大力讨论后面的函数的意义即可. http://blog.csdn.net/popoqqq/article/details ...
- BZOJ 3309: DZY Loves Math 莫比乌斯反演+打表
有一个神奇的技巧——打表 code: #include <bits/stdc++.h> #define N 10000007 #define ll long long #define se ...
- 【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 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 ...
随机推荐
- Android高级模糊技术[转]
今天我们来更深入了解一下Android开发上的模糊技术.我读过几篇有关的文章,也在StackOverFlow上看过一些相关教程的帖子,所以我想在这里总结一下学到的东西. 为什么学习这个模糊技术? 现在 ...
- JavaScript学习01 语言简介、基本使用和变量声明
JavaScript语言简介.基本使用和变量声明 JavaScript是网景(Netscape)公司开发的一种基于客户端浏览器.面向对象.事件驱动式的网页脚本语言. JavaScript的前身叫Liv ...
- 在GitHub上管理项目
在GitHub上管理项目 新建repository 本地目录下,在命令行里新建一个代码仓库(repository) 里面只有一个README.md 命令如下: touch README.md git ...
- Swift使用注意
二.函数的可选参数 参数名:参数类型? = 默认值 // 调用的时候会发现生成了两个函数,一个带imageName,一个不带,选择不带的,调用此函数时将使用参数值nil convenience ini ...
- Android jni开发中的常见错误
错误1:java.lang.UnsatisfiedLinkError: Native method not found: 本地方法没有找到 1.本地函数名写错 2.忘记加载.so文件 没有调用Syst ...
- join()方法
1.现在有T1.T2.T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行? package com.mianshi.easy; class JoinDemo implements ...
- 如何优化TableView
关于UITable的优化: 1.最常用的就是不重复生成单元格,很常见,很实用: 2.使用不透明的视图可以提高渲染速度,xCode中默认TableCell的背景就是不透明的: 3.如果有必要减少视图中的 ...
- 【Android】不依赖焦点和选中的TextView跑马灯【2】
前言 之前有写一篇TextView跑马灯的效果,后来实际项目中有发现新的问题,比如还是无法自动跑,文本超过了显示区域就截取的问题,今天换了一种思路来实现,更简单更好用. 声明 欢迎转载,但请保留文章原 ...
- iOS block从零开始
iOS block从零开始 在iOS4.0之后,block横空出世,它本身封装了一段代码并将这段代码当做变量,通过block()的方式进行回调. block的结构 先来一段简单的代码看看: void ...
- C#中方法的参数的四种类型
C#中方法的参数有四种类型: 1. 值参数类型 (不加任何修饰符,是默认的类型) 2. 引用型参数 (以ref 修饰符声明) 3. 输出型参数 (以out 修 ...