传送门

Sol

\((-1)^a=1-2(a~mod~2)=1-2a+4\lfloor\frac{a}{2}\rfloor\)

那么原式变成 \(n-2\sum_{i=1}^{n}\lfloor d\sqrt{r}\rfloor+4\sum_{i=1}^{n}\lfloor \frac{d\sqrt{r}}{2}\rfloor\)

考虑计算这样一个东西

\[\sum_{i=1}^{n}\lfloor\frac{a*\sqrt{r}+b}{c}i\rfloor
\]

如果 \(\sqrt{r}\) 是一个整数,直接 \(\Theta(1)\) 计算

否则

设 \(k=\frac{a*\sqrt{r}+b}{c}\)

如果 \(k\ge 1\) 那么可以把 \(k\) 的整数部分的值算出来,变成 \(0<k<1\)

如果 \(0<k<1\),即就是计算 \(y=kx\) 与 \(x=n\) 所围成三角形的整点个数

根据类欧几里得那一套理论,我们用矩形的减去左上角的三角形的

矩形的就是 \(n\lfloor nk\rfloor\)

左上角的三角形的把它关于 \(y=x\) 对称,变成求 \(y=\frac{x}{k}\) 与 \(x=\lfloor nk\rfloor\) 所围成三角形的整点个数

这样可以递归下去,\(n\) 的规模减小得很快,最后计算 \(n\le 1\) 的答案即可

为了防止精度误差,可以把 \(k\) 表示成 \(\frac{a*\sqrt{r}+b}{c}\) 将 \(a,b,c\) 存下来

每次弄走 \(gcd\) 就可以了

# include <bits/stdc++.h>
using namespace std;
typedef long long ll; int n, ans, r, test;
double sq; inline ll Gcd(ll a, ll b) {
if (!a || !b) return a | b;
return !b ? a : Gcd(b, a % b);
} inline ll Solve(ll a, ll b, ll c, ll len) {
if (!len) return 0;
register ll sk, nxt, ret, d;
d = Gcd(Gcd(a, b), c), a /= d, b /= d, c /= d;
if (len == 1) return (ll)(1.0 * (sq * a + b) / c);
register double k = 1.0 * (sq * a + b) / c;
sk = (ll)k, k -= sk, nxt = (ll)(k * len), b -= c * sk;
ret = len * nxt + sk * (len + 1) * len / 2;
return ret - Solve(a * c, -b * c, a * a * r - b * b, nxt);
} int main() {
scanf("%d", &test);
while (test--) {
scanf("%d%d", &n, &r), sq = sqrt(r), ans = sq;
if (ans * ans == r) printf("%d\n", (ans & 1) ? ((n & 1) ? -1 : 0) : n);
else printf("%lld\n", n - 2 * Solve(1, 0, 1, n) + 4 * Solve(1, 0, 2, n));
}
return 0;
}

UOJ42. 【清华集训2014】Sum的更多相关文章

  1. 清华集训2014 sum

    清华集训2014sum 求\[∑_{i=1}^{n}(-1)^{⌊i√r⌋}\] 多组询问,\(n\leq 10^9,t\leq 10^4, r\leq 10^4\). 吼题解啊 具体已经讲得很详细了 ...

  2. BZOJ3817 清华集训2014 Sum 类欧几里得

    传送门 令\(\sqrt r = x\) 考虑将\(-1^{\lfloor d \sqrt r \rfloor}\)魔改一下 它等于\(1-2 \times (\lfloor dx \rfloor \ ...

  3. uoj 41 【清华集训2014】矩阵变换 婚姻稳定问题

    [清华集训2014]矩阵变换 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/41 Description 给出 ...

  4. AC日记——【清华集训2014】奇数国 uoj 38

    #38. [清华集训2014]奇数国 思路: 题目中的number与product不想冲: 即为number与product互素: 所以,求phi(product)即可: 除一个数等同于在模的意义下乘 ...

  5. UOJ#46. 【清华集训2014】玄学

    传送门 分析 清华集训真的不是人做的啊嘤嘤嘤 我们可以考虑按操作时间把每个操作存进线段树里 如果现在点x正好使一个整块区间的右端点则更新代表这个区间的点 我们不难发现一个区间会因为不同的操作被分成若干 ...

  6. UOJ#42. 【清华集训2014】Sum 类欧几里德算法

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ42.html 题解 首先我们把式子改写一下: $$(-1)^{\lfloor a\rfloor} \\=1 ...

  7. 【uoj#37/bzoj3812】[清华集训2014]主旋律 状压dp+容斥原理

    题目描述 求一张有向图的强连通生成子图的数目对 $10^9+7$ 取模的结果. 题解 状压dp+容斥原理 设 $f[i]$ 表示点集 $i$ 强连通生成子图的数目,容易想到使用总方案数 $2^{sum ...

  8. BZOJ3812 清华集训2014 主旋律

    直接求出强联通生成子图的数量较难,不妨用所有生成子图的数量减去非强联通的. 非强联通生成子图在所点后满足编号最小的点所在的强联通分量不是全集. 由于$n$很小,我们可以考虑状态压缩. 对于点集$S$, ...

  9. uoj#38. 【清华集训2014】奇数国(线段树+数论)

    传送门 不难看出就是要先求区间积,再求这个区间积的\(\varphi\) 因为\(\varphi(x)=x\times\frac{p_1-1}{p_1}\times\frac{p_2-1}{p_2}\ ...

随机推荐

  1. Windows Server 2012 R2 部署DC及主辅DC

    背景信息: 资源组:hlmdcn DC1:windows Server 2012 R2 Datacenter, A2, hlmdc1, 10.8.0.4DC2:windows Server 2012 ...

  2. 架构师养成记--26.vi/vim相关操作

    vi/vim命令模式插入模式 aio编辑模式 : aio就是vi/vim的插入模式命令    作用a         在光标后附加文本A         在本行末附加文本i         在光标钱插 ...

  3. find查找文件命令 - Linux系统中的常用技巧整理

    “find”在Linux系统中是比较常用的文件查找命令,使用方法有很多,可以拥有查找文件.文件目录.文件更新时间.文件大小.文件权限及对比文件时间.下面是整理的“find”常用方法,方便以后需要的时候 ...

  4. golang使用etcd实现分布式锁

    package main import ( "context" "fmt" "time" "go.etcd.io/etcd/cli ...

  5. 【性能测试】:操作NMON的shell脚本

    nmon是监控服务器的一个工具,可以自动生成快照,每次执行命令就可以了 这里写了一个小的shell脚本,练习一下 #!/bin/sh OSType=`uname` #判断系统类型,选择不同命令 if ...

  6. 2019.04.18 第六次训练 【2018-2019 ACM-ICPC, NEERC, Southern Subregional Contest, Qualification Stage】

    题目链接: https://codeforces.com/gym/101911 又补了set的一个知识点,erase(it)之后it这个地址就不存在了,再引用的话就会RE A: ✅ B:  ✅ C: ...

  7. 剑指offer——面试题32.1:分行从上到下打印二叉树

    void BFSLayer(BinaryTreeNode* pRoot) { if(pRoot==nullptr) return; queue<BinaryTreeNode*> pNode ...

  8. Mac 10.12安装IntelliJ出品的数据库管理工具DataGrip

    下载: (链接: https://pan.baidu.com/s/1nvJw88T 密码: srv2) 安装参考: http://www.cnblogs.com/EasonJim/p/7868645. ...

  9. Linux下C++开发常用命令

    本页面记录本人在Linux下进行C++开发时使用的常用命令,注意这里不包括比如ls,mv等linux命令,这里会持续更新.首先假设你只有一个源程序文件,叫vec.cpp,编译后的可执行程序叫vec(本 ...

  10. 使用Java Servlet进行简单登录

    效果图 登录页面代码:login.html <%@ page language="java" contentType="text/html; charset=UTF ...