【BZOJ2671】Calc 数学
【BZOJ2671】Calc
Description
1.1<=a<b<=N
2.a+b整除a*b
Input
一行一个数N
Output
一行一个数表示答案
Sample Input
Sample Output
HINT
数据规模和约定
N <=2^31-1
题解:玄学数学题,推导过程不难但很扯,直接上式子:
设d=gcd(a,b),则$a+b|ab$->$a'd+b'd|a'b'd^2$->$a'+b'|a'b'd$->$a'+b'|d$。
问题就变成了问你有多少个数对(a,b)满足a与b互质且$(a+b)d\le n$,$a+b|d$,又因为d>b所以b最多只能是$\sqrt n$。我们将其形式化的写出来:设$m=\sqrt n$
$\sum\limits_{b=1}^m\sum\limits_{a=1}^{b-1}[gcd(a,b)==1]\lfloor{n\over a+b}\rfloor$
反演一波$\sum\limits_{d=1}^m\mu(d)\sum\limits_{b=1}^{\lfloor {m\over d}\rfloor}\sum\limits_{a=1}^{b-1}\lfloor{n\over d^2(a+b)}\rfloor$
你敢相信。。。推到这就能A了吗?复杂度什么的见鬼去吧~
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=100010;
ll n,m,ans;
int num;
int np[N],pri[N],mu[N];
inline ll calc(int n,int m)
{
ll ret=0;
int i,j,t,last;
//for(i=1;i<=m;i++) for(j=1;j<i;j++) ret+=n/i/(i+j);
//return ret;
for(i=1;i<=m;i++)
{
t=n/i;
for(j=i+1;j<(i<<1)&&j<=t;j=last+1)
{
last=min((i<<1)-1,t/(t/j));
ret+=1ll*(last-j+1)*(t/j);
}
}
return ret;
}
ll gcd(ll a,ll b)
{
return !b?a:gcd(b,a%b);
}
int main()
{
scanf("%lld",&n),m=sqrt(n);
int i,j;
ll last;
mu[1]=1;
//for(i=1;i<=m;i++) for(j=1;j<i;j++) if(gcd(i,j)==1) ans+=n/i/(i+j);
//printf("%lld\n",ans),ans=0;
for(i=2;i<=m;i++)
{
if(!np[i]) pri[++num]=i,mu[i]=-1;
for(j=1;j<=num&&i*pri[j]<=m;j++)
{
np[i*pri[j]]=1;
if(i%pri[j]==0) break;
mu[i*pri[j]]=-mu[i];
}
}
for(i=1;i<=m;i++) last=calc(n/i/i,m/i),ans+=mu[i]*last;
printf("%lld",ans);
return 0;
}
【BZOJ2671】Calc 数学的更多相关文章
- BZOJ2671 Calc 【莫比乌斯反演】
题目链接 BZOJ2671 题解 令\(d = (a,b)\),\(a = dx,b = dy\) 那么有 \[ \begin{aligned} d(x + y) | d^2xy \\ (x + y) ...
- BZOJ2671 Calc(莫比乌斯反演)
两个多月之前写的题,今天因为看到一道非常相似的题就翻出来了,发现完全不会,没救. 感觉这个题其实第一步是最难想到的,也是最重要的. 设d=gcd(a,b).那么a=yd,b=xd,且gcd(x,y)= ...
- BZOJ2671 : Calc
设$d=\gcd(a,b),a=xd,b=yd$,则$a+b|ab$等价于$x+y|xyd$. 因为$x,y$互质,所以$x+y|d$. 假设$x<y$,那么对于固定的$x,y$,有$\lflo ...
- CSS当中数学表达式calc
CSS当中数学表达式calc 数学表达式calc()是CSS中的函数,主要用于数学运算.使用calc()为页面元素布局提供了便利和新的思路.本文将介绍calc()的相关内容 定义 数学表达式calc ...
- 常用的Css函数
1. attr() 用来选择元素的属性值,用法:attr(html元素的属性名),正常搭配css content一起使用 html: <p><a href="http:// ...
- 理解CSS中的数学表达式calc()
前面的话 数学表达式calc()是CSS中的函数,主要用于数学运算.使用calc()为页面元素布局提供了便利和新的思路.本文将介绍calc()的相关内容 定义 数学表达式calc()是calculat ...
- css3 calc():css简单的数学运算-加减乘除
css3 calc():css简单的数学运算–加减乘除 多好的东西啊,不用js,一个css就解决了. .box{ border:1px solid #ddd; width:calc(100% - 10 ...
- css中的数学表达式calc()
前言 数学表达式calc()是CSS中的函数,主要用于数学运算.使用calc()为页面元素布局提供了便利和新的思路. 概念 数学表达式calc()是calculate计算的缩写,它允许使用+.-.*. ...
- 【BZOJ2671】Calc(莫比乌斯反演)
[BZOJ2671]Calc 题面 BZOJ 给出N,统计满足下面条件的数对(a,b)的个数: 1.\(1\le a\lt b\le N\) 2.\(a+b\)整除\(a*b\) 我竟然粘了题面!!! ...
随机推荐
- Verilog 加法器和减法器(8)-串行加法器
如果对速度要求不高,我们也可以使用串行加法器.下面通过状态机来实现串行加法器的功能. 设A=an-1an-2-a0, B=bn-1bn-2-b0,是要相加的两个无符号数,相加的和为:sum=sn-1s ...
- [Mockito] Spring Unit Testing with Mockito
It is recommened to write unit testing with Mockito in Spring framework, because it is much faster w ...
- WPF应用程序exe接收参数
using System;using System.ServiceProcess; namespace GoShopService{ public partial class Service1 ...
- 如何部署hadoop集群
假设我们有三台服务器,他们的角色我们做如下划分: 10.96.21.120 master 10.96.21.119 slave1 10.96.21.121 slave2 接下来我们按照这个配置来部署h ...
- 【Windows】查看Windows上运行程序的异常日志
任何在windows系统上运行的程序,只要发生异常导致程序异常终止,windows都会在日志中详细记录这个异常.可以在计算机管理中查看,如图:也可以在操作中心查看,如图:
- 第三方文本框 在div中显示预览,让指定节点不受外部css影响
例如,富文本框中 ol li 但是我们往往全局样式时候会 让前面的数字不显示,但是富文本框时候,录入,我们需要显示,但是div中就不显示了 我们在预览页面中加上一个指定样式 然后后面 加上!im ...
- Nginx 访问日志配置
一.Nginx 访问日志介绍 Nginx 软件会把每个用户访问网站的日志信息记录到指定的日志文件里,供网站提供者分析用户的浏览行为等,此功能由 ngx_http_log_module 模块负责. 二. ...
- 设置Nginx以列表方式显示网站内容
服务器目录内容: 访问该页面时,将所有文件和目录按列表方式显示 nginx配置文件
- RandomAccessFile类理解
一.简述 这个是JDK上的截图,我们可以看到它的父类是Object,没有继承字节流.字符流家族中任何一个类.并且它实现了DataInput.DataOutput这两个接口,也就意味着这个类既可以读也可 ...
- Spring Boot 2.0 入门指南
0x01 什么是Spring Boot? Spring Boot是用来简化Spring应用初始搭建以及开发过程的全新框架,被认为是Spring MVC的“接班人”,和微服务紧密联系在一起. 0x02 ...