【BZOJ3817/UOJ42】Sum(类欧)
【BZOJ3817/UOJ42】Sum(类欧)
题面
题解
令\(x=\sqrt r\),那么要求的式子是$$\sum_{d=1}n(-1){[dx]}$$
不难发现,对于每个\(d\)而言的取值只和\([dx]\)的奇偶性相关。
如果\(x\)是个整数,也就是\(r\)是完全平方数的时候,显然是可以直接算答案的。
计算答案的时候显然之和有几个奇数或者几个偶数相关(只要求一个另外一个就是补集)
比如说我们来求有几个是偶数,那么要满足的条件就是\([dx]=2*[\frac{dx}{2}]\)。
先重新写下式子,我们写成这个样子$$\sum_{d=1}^n(1-2*([dx]\ mod\ 2)$$
这个显然成立,当\([dx]\)是偶数的时候贡献是\(1\),奇数的时候贡献是\(0\)。
而\([dx]\ mod\ 2\)可以写成减法的形式。所以原式可以写成
\]
化简之后得到了
\]
现在把模型转化一下,变得更加一般一点,那么要求解的东西是$$\sum _{d=1}^n[\frac{ax+b}{c}d]$$
听说这个玩意叫做类欧?类欧几里得算法。
令\(k=\frac{ax+b}{c}\),那么式子可以化简为\(\sum[kd]\)
这里进行分类讨论
1.当\(k>=1\)的时候
\]
显然后面那一半是可以直接计算的,而前面这一半令\(k'=k-[\frac{ax+b}{c}]\)
我们可以递归处理。
2.\(k<1\)
转化到一个坐标系上面去,我们要求的东西本质上就是有一条直线\(y=kx\),要求解\(x\in[1,n]\)时,与\(x=n\)、\(x\)正半轴围成的三角形内部整点的个数。
我们把这个三角形逆时针旋转\(90\)度,再沿着\(y\)轴翻转过来,让长度为\(n\)的那条边靠着\(y\)轴,这样子翻转过来之后,\(k\)变成了倒数,\(n\)变成了\([nk]\),然后拿矩形减去多出来的部分,不就是矩形减去\(k>=1\)的情况了吗?
再讨论一下取倒数的结果,斜率\(k=\frac{ax+b}{c}\),取倒数之后\(k=\frac{c}{ax+b}\),然后分母有理化一下\(k=\frac{c(ax-b)}{a^2r-b^2}\)。
总的时间复杂度是\(log\)级别的。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define ll long long
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
double x;ll n,r;
ll Calc(ll a,ll b,ll c,ll n)
{
if(!n)return 0;
ll d=__gcd(a,__gcd(b,c));a/=d;b/=d;c/=d;
ll k=(a*x+b)/c;
if(!k)
{
ll N=(a*x+b)/c*n;
return n*N-Calc(a*c,-b*c,a*a*r-b*b,N);
}
else
return k*n*(n+1)/2+Calc(a,b-c*k,c,n);
}
int main()
{
int T=read();
while(T--)
{
n=read();r=read();x=sqrt(r);
ll k=x;
if(k*k==r)
{
if(k&1)printf("%lld\n",n-2*((n+1)/2));
else printf("%lld\n",n);
}
else printf("%lld\n",n+Calc(1,0,2,n)*4-Calc(1,0,1,n)*2);
}
return 0;
}
【BZOJ3817/UOJ42】Sum(类欧)的更多相关文章
- BZOJ3817 清华集训2014 Sum 类欧几里得
传送门 令\(\sqrt r = x\) 考虑将\(-1^{\lfloor d \sqrt r \rfloor}\)魔改一下 它等于\(1-2 \times (\lfloor dx \rfloor \ ...
- UOJ#42. 【清华集训2014】Sum 类欧几里德算法
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ42.html 题解 首先我们把式子改写一下: $$(-1)^{\lfloor a\rfloor} \\=1 ...
- JZOJ3492数数&&GDOI2018超级异或绵羊——位&&类欧几里得
JZOJ3492 数数(count) 我们知道,一个等差数列可以用三个数A,B,N表示成如下形式: B+A,B+2A,B+3A⋯B+NA ztxz16想知道对于一个给定的等差数列,把其中每一项用二进 ...
- 2019牛客多校九 I. KM and M (类欧几里得)
大意: 给定$N,M$, 求$\sum\limits_{K=1}^N \text{(KM)&M}$ 考虑第$i$位的贡献, 显然为$\lfloor\frac{KM}{2^i}\rfloor$为 ...
- Kattis - itsamodmodmodmodworld It's a Mod, Mod, Mod, Mod World (类欧几里得)
题意:计算$\sum\limits_{i=1}^n[(p{\cdot }i)\bmod{q}]$ 类欧模板题,首先作转化$\sum\limits_{i=1}^n[(p{\cdot}i)\bmod{q} ...
- [ZZOJ#31]类欧几里得
[ZZOJ#31]类欧几里得 试题描述 这是一道模板题. 给出 \(a, b, c, n\),请你求出 \(\sum_{x=0}^n{\lfloor \frac{a \cdot x + b}{c} \ ...
- 算法马拉松35 E 数论只会Gcd - 类欧几里得 - Stern-Brocot Tree - 莫比乌斯反演
题目传送门 传送门 这个官方题解除了讲了个结论,感觉啥都没说,不知道是因为我太菜了,还是因为它真的啥都没说. 如果 $x \geqslant y$,显然 gcd(x, y) 只会被调用一次. 否则考虑 ...
- bzoj2187 fraction&&hdu3637 Find a Fraction——类欧几里得
bzoj2187 多组询问,每次给出 $a, b, c, d$,求满足 $\frac{a}{b} < \frac{p}{q} < \frac{c}{d}$ 的所有二元组 $(p, q)$ ...
- CF1182F Maximum Sine【类欧,扩欧】
题目链接:洛谷 题目描述:求整数$x\in [a,b]$使得$|2px \ mod \ 2q-q|$最小,如果有多个$x$输出最小的. 数据范围:$1\leq a,b,p,q\leq 10^9$ 第一 ...
随机推荐
- Codeforces Round #481 (Div. 3)
我实在是因为无聊至极来写Div3题解 感觉我主要的作用也就是翻译一下题目 第一次线上打CF的比赛,手速很重要. 这次由于所有题目都是1A,所以罚时还可以. 下面开始讲题 A.Remove Duplic ...
- Codeforces 987E Petr and Permutations(数组的置换与复原 、结论)
题目连接: Petr and Permutations 题意:给出一个1到n的序列,Petr打乱了3n次,Um_nik打乱了7n+1次,现在给出被打乱后的序列,求是谁打乱的. 题解:因为给出了一个3* ...
- 值类型和引用类型的区别,struct和class的区别
C#值类型和引用类型 1.简单比较 值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储在数据堆中. 值类型(value type):byte,short,int,long,floa ...
- Linux下monit进程管理操作梳理
Monit对运维人员来说可谓神器,它是一款功能非常丰富的进程.文件.目录和设备的监测工具,用于Unix平台.它可以自动修复那些已经停止运作的程序,特使适合处理那些由于多种原因导致的软件错误.Monit ...
- 在Mac终端显示 Git 当前所在分支
1.进入你的home目录 cd ~ 2.编辑.bashrc文件 vi .bashrc 3.将下面的代码加入到文件的最后处 function git_branch { branch="`git ...
- linux-IO重定向-文本流重定向
输出重定向的追加和覆盖 标准输出就这两种: 覆盖和追加 >> 是重定向操作符 1 是 命令的文件描述符 重定向操作符合文件描述符之间不能存在空白符 否则1会被当做是文件被读取 将正确和错误 ...
- C-数据结构-typedef的用法
.typedef的用法 # include <stdio.h> typedef int zhang; //为数据类为int从新取名为zhang 等价于int typedef struct ...
- Pairproject 移山之道 阅读随笔和一些问题
首先不得不承认这本书的写作方式很独特,不像其他的计算机类的图书那样枯燥,让人读起来感觉很有意思,他也颠覆了我对计算机类图书的看法,这种写作方式值得我们学习. 先谈谈收获吧.读了两年大学,这是第一次写类 ...
- 使用Spring提供的缓存抽象机制整合EHCache为项目提供二级缓存
Spring自身并没有实现缓存解决方案,但是对缓存管理功能提供了声明式的支持,能够与多种流行的缓存实现进行集成. Spring Cache是作用在方法上的(不能理解为只注解在方法上),其核心思想是 ...
- myBatis插件(plugins)
MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用.默认情况下,MyBatis 允许使用插件来拦截的方法调用包括: Executor (update, query, flushState ...