【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} \ ...
随机推荐
- 设计模式之Adapter
设计模式总共有23种模式这仅仅是为了一个目的:解耦+解耦+解耦...(高内聚低耦合满足开闭原则) 介绍: 将两个不兼容的类纠合在一起使用,属于结构型模式,也有人称它为wrapper(包装类). 包装类 ...
- 生产环境手把手部署ERC20智能合约
工具 rimex http://remix.ethereum.org/ metamask https://metamask.io/ ERC20 代码 https://github.com/OpenZe ...
- fileIO和OS操作文件和目录
1.FileIO操作文件 # 文件IO,读取文件和创建文件 # 1.读取键盘输入 x=input("please input number") print("您输入的是& ...
- 环境变量配错了 command not found
一般就是忘记在PATH 前面加$ 1.可以用whereis或者which命令查看一下有没有这个命令 具体执行which lswhereis ls 2.系统环境变量导致的问题解决方案: exportPA ...
- angular 最大字数限制
js可以通过onkeyup onkeydown判断当前节点字数. angular可以通过监听的方式: $scope.input = {//初始化,避免ng-model绑定取不到值 MaxBT:'', ...
- python进阶之内置函数和语法糖触发魔法方法
前言 前面已经总结了关键字.运算符与魔法方法的对应关系,下面总结python内置函数对应的魔法方法. 魔法方法 数学计算 abs(args):返回绝对值,调用__abs__; round(args): ...
- 很多人都没用过的轻量级Oracle数据库数据导出工具SQLLDR2——性能超赞
SQLLDR2 介绍 每周发表一篇数据库或大数据相关的帖子,敬请关注 1. 工具介绍 Sqluldr2(SQL * UnLoader 第二版)是灵活与强大的 Oracle 文本导出程序,已被大众使 用 ...
- Linux中切换用户变成-bash4.1-$的解决方法
原因是root在/root下面的几个配置文件丢失,将/etc/skel/目录下的三个文件拷贝到用户家目录即可 cp /etc/skel/.bashrc /root/ cp /etc/skel/.bas ...
- openjudge-NOI 2.6-2988 计算字符串距离
题目链接:http://noi.openjudge.cn/ch0206/2988/ 题解: 首先,题目有误,少了一个添加操作 和求解LCS之类的思路类似 f[i][j]表示a序列中1..i的部分和b序 ...
- css弹性盒子
body元素设置: <body> <div id="wai"> <div class="zi">1</div> ...