2671: Calc

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 303  Solved: 157

Description

  给出N,统计满足下面条件的数对(a,b)的个数:
  1.1<=a<b<=N
  2.a+b整除a*b

Input

 一行一个数N

Output

 一行一个数表示答案

Sample Input

15

Sample Output

4

HINT

数据规模和约定

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 (数论,莫比乌斯反演)的更多相关文章

  1. BZOJ 4176 Lucas的数论 莫比乌斯反演+杜教筛

    题意概述:求,n<=10^9,其中d(n)表示n的约数个数. 分析: 首先想要快速计算上面的柿子就要先把d(ij)表示出来,有个神奇的结论: 证明:当且仅当a,b没有相同的质因数的时候我们统计其 ...

  2. [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)有多少对. ...

  3. 【BZOJ2671】Calc(莫比乌斯反演)

    [BZOJ2671]Calc 题面 BZOJ 给出N,统计满足下面条件的数对(a,b)的个数: 1.\(1\le a\lt b\le N\) 2.\(a+b\)整除\(a*b\) 我竟然粘了题面!!! ...

  4. BZOJ.2301.[HAOI2011]Problem B(莫比乌斯反演 容斥)

    [Update] 我好像现在都看不懂我当时在写什么了=-= \(Description\) 求\(\sum_{i=a}^b\sum_{j=c}^d[(i,j)=k]\) \(Solution\) 首先 ...

  5. 【BZOJ4176】Lucas的数论 莫比乌斯反演

    [BZOJ4176]Lucas的数论 Description 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目“求Sigma(f(i)) ...

  6. Bzoj 2301: [HAOI2011]Problem b(莫比乌斯反演+除法分块)

    2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MB Description 对于给出的n个询问,每次求有多少个数对(x, ...

  7. BZOJ 1114 Number theory(莫比乌斯反演+预处理)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=71738 题意:给你一个整数序列a1, a2, a3, ... , ...

  8. BZOJ 2301 Problem b(莫比乌斯反演+分块优化)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=37166 题意:对于给出的n个询问,每次求有多少个数对(x,y),满 ...

  9. 51Nod1675 序列变换 数论 莫比乌斯反演

    原文http://www.cnblogs.com/zhouzhendong/p/8665675.html 题目传送门 - 51Nod1675 题意 给定序列$a,b$,让你求满足$\gcd(x,y)= ...

  10. UOJ#62. 【UR #5】怎样跑得更快 数论 莫比乌斯反演

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ62.html 题解 太久没更博客了,该拯救我的博客了. $$\sum_{1\leq j \leq n} \ ...

随机推荐

  1. 如何构建一个很棒网站页脚(Website Footer)

    对于很多人来说,制作页脚是只是设计师顺手而为的任务.它似乎很容易,似乎可以忽略不计.因为很多人都觉得网站底部很少人会去看,而且页脚链接的所有链接的点击率(CTR)都是最低的,何必呢? 真是这样的吗?下 ...

  2. 《JavaScript 实战》:实现拖放(Drag & Drop)效果

    拖放效果,也叫拖拽.拖动,学名Drag-and-drop ,是最常见的js特效之一.如果忽略很多细节,实现起来很简单,但往往细节才是难点所在.这个程序的原型是在做图片切割效果的时候做出来的,那时参考了 ...

  3. 【CodeForces】947 D. Picking Strings

    [题目]D. Picking Strings [题意]给定只含'A','B','C'的字符串,支持以下变换:1.A - BC   2.B - AC   3.C - AB   4.AAA - empty ...

  4. 详解H5中的history单页面,手动实现单页面开发,细说h5单页面原理

    就目前来看,前端的单页面开发占了很大一部分,一方面无刷新的切换增强了体验,并且浏览器记录依然存在,前进后退都没问题,在之前我们通地址栏中的hash改变来触发onhashchange方法来实现单页面应用 ...

  5. C#里面中将字符串转为变量名

    public partial class Form1 : Form { string str = "spp"; public string spp = "very goo ...

  6. 生成验证码tp

    js里拼接随机数 页面上链接 去掉后缀名

  7. okhttp3使用详解

    http://blog.csdn.net/itachi85/article/details/51190687

  8. 【Explain】mysql之explain详解(分析索引的最佳使用)

    在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,些时我们常常用到explain 这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句 ...

  9. python并发编程之进程、线程、协程的调度原理(六)

    进程.线程和协程的调度和运行原理总结. 系列文章 python并发编程之threading线程(一) python并发编程之multiprocessing进程(二) python并发编程之asynci ...

  10. Lempel-Ziv algorithm realization

    Lempel-Ziv 复杂度程序 随着人们对非线性方法的分析越加深入,他们发现,虽然关联维度和最大李雅谱诺夫指数在分析脑电时具有一定的帮助,但是它们对数据的依赖性太强,对干扰和噪 声太敏感,而且要得到 ...