【BZOJ 2671】 2671: Calc (数论,莫比乌斯反演)
2671: Calc
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 303 Solved: 157Description
给出N,统计满足下面条件的数对(a,b)的个数:
1.1<=a<b<=N
2.a+b整除a*bInput
一行一个数N
Output
一行一个数表示答案
Sample Input
15Sample Output
4HINT
数据规模和约定
Test N Test N
1 <=10 11 <=5*10^7
2 <=50 12 <=10^8
3 <=10^3 13 <=2*10^8
4 <=5*10^3 14 <=3*10^8
5 <=2*10^4 15 <=5*10^8
6 <=2*10^5 16 <=10^9
7 <=2*10^6 17 <=10^9
8 <=10^7 18 <=2^31-1
9 <=2*10^7 19 <=2^31-1
10 <=3*10^7 20 <=2^31-1
Source
【分析】
这题的复杂度还挺迷人的。
然后$\sqrt n$也没发现,以为筛$\mu$都要$O(n)$,什么杜教筛的幸好不会。。
首先分析$(a+b)|(a*b) → (a/g+b/g)|(a/g*b/g*g) →(a/g+b/g)|g$
那就是互质的$a',b'$ 找他们的公倍数$g$就行了。
写正常一点就是$$\sum_{j=1}^{N}\sum_{i=1}^{j-1}\dfrac{n}{j*(i+j)} [gcd(i,j)==1]$$
到了这里,我就傻眼了,其实嘛。。。j并不会到$n$,只是到$\sqrt{n}$
$$\sum_{j=1}^{\sqrt{n}}\sum_{i=1}^{j-1}\dfrac{n}{j*(i+j)} [gcd(i,j)==1]$$
然后我又傻眼了,复杂度迷人的东西啊会把我脑子弄得很乱的。
直接枚举j,然后i那里分块,然后就是求[l,r]里面和j互质的数的个数。
差分,先求[1,r]里面的,就是$\sum_{x=1}^{r}1[gcd(x,j)==1]$
即$\sum_{d=1}^{r}\mu(d)*(r/d)$
最后就是$\sum_{d=1}^{r}\mu(d)*(r/d-(l-1)/d)$
枚举约数在前面$\sqrt{j}$枚举去了。。
真的是暴力出奇迹了。。。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define Maxn 50010
#define LL long long bool vis[Maxn];
int pri[Maxn],pl,mu[Maxn]; int mymin(int x,int y) {return x<y?x:y;} void init()
{
memset(vis,,sizeof(vis));
pl=;mu[]=;
for(int i=;i<=Maxn;i++)
{
if(!vis[i]) pri[++pl]=i,vis[i]=,mu[i]=-;
for(int j=;j<=pl;j++)
{
if(i*pri[j]>Maxn) break;
vis[i*pri[j]]=;
if(i%pri[j]==) {mu[i*pri[j]]=;break;}
mu[i*pri[j]]=-mu[i];
}
}
} int sta[Maxn],sl; void div(int x)
{
sl=;
int i;
for(i=;i*i<x;i++)
{
if(x%i==) sta[++sl]=i,sta[++sl]=x/i;
}
if(i*i==x) sta[++sl]=i;
} int gcd(int a,int b)
{
if(b==) return a;
return gcd(b,a%b);
} int main()
{
int n;
scanf("%d",&n);
init();
LL ans=;
int sq=(int)(sqrt((double)n));
for(int i=;i<=sq;i++)
{
div(i);
for(int j=;j<i;)
{
int x=n/i/(i+j),r;if(x==) break;
r=mymin(i-,n/x/i-i);
for(int k=;k<=sl;k++)
{
ans+=mu[sta[k]]*(r/sta[k]-(j-)/sta[k])*x;
}
j=r+;
}
}
printf("%lld\n",ans);
return ;
}
2017-04-06 15:50:26
【BZOJ 2671】 2671: Calc (数论,莫比乌斯反演)的更多相关文章
- BZOJ 4176 Lucas的数论 莫比乌斯反演+杜教筛
题意概述:求,n<=10^9,其中d(n)表示n的约数个数. 分析: 首先想要快速计算上面的柿子就要先把d(ij)表示出来,有个神奇的结论: 证明:当且仅当a,b没有相同的质因数的时候我们统计其 ...
- [BZOJ 2820] YY的gcd(莫比乌斯反演+数论分块)
[BZOJ 2820] YY的gcd(莫比乌斯反演+数论分块) 题面 给定N, M,求\(1\leq x\leq N, 1\leq y\leq M\)且gcd(x, y)为质数的(x, y)有多少对. ...
- 【BZOJ2671】Calc(莫比乌斯反演)
[BZOJ2671]Calc 题面 BZOJ 给出N,统计满足下面条件的数对(a,b)的个数: 1.\(1\le a\lt b\le N\) 2.\(a+b\)整除\(a*b\) 我竟然粘了题面!!! ...
- BZOJ.2301.[HAOI2011]Problem B(莫比乌斯反演 容斥)
[Update] 我好像现在都看不懂我当时在写什么了=-= \(Description\) 求\(\sum_{i=a}^b\sum_{j=c}^d[(i,j)=k]\) \(Solution\) 首先 ...
- 【BZOJ4176】Lucas的数论 莫比乌斯反演
[BZOJ4176]Lucas的数论 Description 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目“求Sigma(f(i)) ...
- Bzoj 2301: [HAOI2011]Problem b(莫比乌斯反演+除法分块)
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MB Description 对于给出的n个询问,每次求有多少个数对(x, ...
- BZOJ 1114 Number theory(莫比乌斯反演+预处理)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=71738 题意:给你一个整数序列a1, a2, a3, ... , ...
- BZOJ 2301 Problem b(莫比乌斯反演+分块优化)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=37166 题意:对于给出的n个询问,每次求有多少个数对(x,y),满 ...
- 51Nod1675 序列变换 数论 莫比乌斯反演
原文http://www.cnblogs.com/zhouzhendong/p/8665675.html 题目传送门 - 51Nod1675 题意 给定序列$a,b$,让你求满足$\gcd(x,y)= ...
- UOJ#62. 【UR #5】怎样跑得更快 数论 莫比乌斯反演
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ62.html 题解 太久没更博客了,该拯救我的博客了. $$\sum_{1\leq j \leq n} \ ...
随机推荐
- DOM操作二三事
我突然想起了append(),但是我记不太清它是原生JS的还是jQuery封装的,貌似是JS的,咦?那它在jQuery里叫什么来着?哎呀!记不清了!确定append()是JS里的?不是jQuery里的 ...
- [oracle]centos 7 安装oracle
换了好几个系统终于还是利用centos安装oralce成功了,这里我也参考了网上的好多资料以及oracle的官方文档 1.下载oracle,我这里选择的是11gr2版本,下载下来后有两个文件,利用un ...
- 认识单点登录cas
么是单点登录?单点登录全称Single Sign On(以下简称SSO),是指在多系统应用群中登录一个系统,便可在其他所有系统中得到授权而无需再次登录,包括单点登录与单点注销两部分 1.登录 相比于单 ...
- 关于Re模块的一些基础知识(另附一段批量抓代理ip的代码)
1.常用匹配规则 . 表示任意字符[0-9] 用来匹配一个指定的字符类别[^5]表示除了5之外的其他字符,^不在字符串的开头,则表示它本身.* 对于前一个字符重复0到无穷次+ 对于前一个字符重复1到无 ...
- python初步学习-异常
异常 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行. 一般情况下,在python无法正常处理程序时就会发生一个异常. 异常是python对象,表示一个错误. 当python脚本 ...
- VC连接access
(1)首先拷贝 c:\program files\common files\system\ado\ 目录中的 msado15.dll 文件到项目中. (2)在VC中加入DLL,具体方法如下: (3)创 ...
- Go语言 2 变量、常量和数据类型
文章由作者马志国在博客园的原创,若转载请于明显处标记出处:http://www.cnblogs.com/mazg/ Go学习群:415660935 2.1 变量 变量是对一块内存空间的命名,程序可以通 ...
- 数据库与sql注入的相关知识
数据库与sql注入的相关知识 sql语句明显是针对数据库的一种操作,既然想通过sql注入的方法来拿取数据那么就要先了解一下如何的去操作数据库,这方面并不需要对数据库有多么的精通但是如果了解掌握了其中的 ...
- MySQL数据库的“十宗罪”【转】
今天就给大家列举 MySQL 数据库中最经典的十大错误案例,并附有处理问题的解决思路和方法.希望能给刚入行或数据库爱好者一些帮助,今后再遇到任何报错,我们都可以很淡定地去处理.学习任何一门技术的同时, ...
- http 错误代码解释 && nginx 自定义错误【转】
如果向您的服务器发出了某项请求要求显示您网站上的某个网页(例如,当用户通过浏览器访问您的网页或在 Googlebot 抓取该网页时),那么,您的服务器会返回 HTTP 状态代码以响应该请求. 此状态代 ...