BZOJ 3817 Sum
Description
Input
Output
Sample Input
3 5
3 6
3 7
Sample Output
1
-1
HINT
$$
\begin{align}
-1^{dx } & =1-2( dx \% 2) \\
&=1-2(dx - \frac{dx}{2} * 2) \\
&= 1+4\frac{dx}{2} + 2 dx
\end{align}
$$
那么
$$原式 =n + 4 \sum_{d=1}^{n} \frac{dx}{2}-2\sum_{d=1}^{n}dx$$
那么有
$ans=\sum_{i=1}^{n}\sum_{j=1}^{\lfloor k*n \rfloor}[k*i>j]$
按照类欧的套路,移项
$ans=\sum_{i=1}^{n}\sum_{j=1}^{\lfloor k*n \rfloor}[i>\lfloor \frac{j}{k} \rfloor]$
交换枚举顺序
$ans=\sum_{j=1}^{\lfloor k*n \rfloor}n-\lfloor \frac{j}{k} \rfloor$
$ans=\lfloor k*n \rfloor*n-\sum_{j=1}^{\lfloor k*n \rfloor}\lfloor \frac{j}{k} \rfloor$
把$\frac{1}{k}$的分母有理化,发现后面这部分可以递归
我们发现在$k<1$递归$\frac{1}{k}$时,下一个$k$会大于1,这样下一个$n$会变大
我们可以用这个方法;
$ans=\sum_{i=1}^{n}\lfloor k*i \rfloor$
$ans=\sum_{i=1}^{n}\lfloor k*i-\lfloor k \rfloor*i+\lfloor k \rfloor*i \rfloor$
$ans=\sum_{i=1}^{n}\lfloor k*i-\lfloor k \rfloor*i \rfloor+\lfloor k \rfloor*i$
$ans=\lfloor k \rfloor*\frac{n*(n+1)}{2}+\sum_{i=1}^{n}\lfloor k*i-\lfloor k \rfloor*i \rfloor$
$\lfloor k*i-\lfloor k \rfloor*i \rfloor=\lfloor \frac{a*x+b-c*\lfloor \frac{a*x+b}{c} \rfloor}{c} *i\rfloor$
把当前的$k$替换
$k=\frac{a*x+b-c*\lfloor \frac{a*x+b}{c} \rfloor}{c}$
这样$k$就小于1了
然后按$k<1$的情况递归
由于每次$n$都会乘以一个小于1的数,所以复杂度大概是$O(logn)$
不过为了防止暴longlong要提出gcd,用辗转相除
最后复杂度是$O(Tlog^{2}n)$
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long lol;
double t;
lol r;
lol gcd(lol a,lol b)
{
if (!b) return a;
return gcd(b,a%b);
}
lol cal(lol a,lol b,lol c,lol n)
{
if (n==) return ;
lol g=gcd(a,gcd(b,c));
a/=g;b/=g;c/=g;
lol k=(t*a+b)/c;
lol ans=n*(n+)/*k;
b-=k*c;
k=(t*a+b)/c*n;
ans+=k*n-cal(a*c,-b*c,a*a*r-b*b,k);
return ans;
}
int main()
{int T;
lol n,ans;
cin>>T;
while (T--)
{
scanf("%lld%lld",&n,&r);
t=sqrt((double)r);
if ((lol)t==t)
{
if ((lol)t%==)
{
printf("%lld\n",n);
}
else
{
if (n%==)
printf("0\n");
else printf("-1\n");
}
}
else
{
ans=n+(cal(,,,n)<<)-(cal(,,,n)<<);
printf("%lld\n",ans);
}
}
}
BZOJ 3817 Sum的更多相关文章
- ●杜教筛入门(BZOJ 3944 Sum)
入门杜教筛啦. http://blog.csdn.net/skywalkert/article/details/50500009(好文!) 可以在$O(N^{\frac{2}{3}})或O(N^{\f ...
- BZOJ 3944 Sum
题目链接:Sum 嗯--不要在意--我发这篇博客只是为了保存一下杜教筛的板子的-- 你说你不会杜教筛?有一篇博客写的很好,看完应该就会了-- 这道题就是杜教筛板子题,也没什么好讲的-- 下面贴代码(不 ...
- BZOJ 3944: Sum [杜教筛]
3944: Sum 贴模板 总结见学习笔记(现在还没写23333) #include <iostream> #include <cstdio> #include <cst ...
- BZOJ.3944.Sum(Min_25筛)
BZOJ 洛谷 不得不再次吐槽洛谷数据好水(连\(n=0,2^{31}-1\)都没有). \(Description\) 给定\(n\),分别求\[\sum_{i=1}^n\varphi(i),\qu ...
- bzoj 3944: Sum(杜教筛)
3944: Sum Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 4930 Solved: 1313[Submit][Status][Discuss ...
- BZOJ 3944 Sum 解题报告
我们考虑令: \[F_n = \sum_{d|n}\varphi(d)\] 那么,有: \[\sum_{i=1}^{n}F_i = \sum_{i=1}^{n}\sum_{d|i}\varphi(d) ...
- 【刷题】BZOJ 3944 Sum
Description Input 一共T+1行 第1行为数据组数T(T<=10) 第2~T+1行每行一个非负整数N,代表一组询问 Output 一共T行,每行两个用空格分隔的数ans1,ans ...
- 「bzoj 3944: Sum」
题目 杜教筛板子了 #include<iostream> #include<cstring> #include<cstdio> #include<cmath& ...
- bzoj 3944: Sum【莫比乌斯函数+欧拉函数+杜教筛】
一道杜教筛的板子题. 两个都是积性函数,所以做法是一样的.以mu为例,设\( f(n)=\sum_{d|n}\mu(d) g(n)=\sum_{i=1}^{n}f(i) s(n)=\sum_{i=1} ...
随机推荐
- Alpha第十天
Alpha第十天 听说 031502543 周龙荣(队长) 031502615 李家鹏 031502632 伍晨薇 031502637 张柽 031502639 郑秦 1.前言 任务分配是VV.ZQ. ...
- Bate版敏捷冲刺每日报告--day1
1 团队介绍 团队组成: PM:齐爽爽(258) 小组成员:马帅(248),何健(267),蔡凯峰(285) Git链接:https://github.com/WHUSE2017/C-team 2 ...
- 团队作业2:需求分析&原型设计
Deadline: 2017-11-5 22:00PM,以博客发表日期为准. 评分基准: 按时交 - 有分,检查的项目包括后文的三个方面 需求分析 原型设计 编码规范 晚交 - 0分 迟交两周以 ...
- 微信小程序测试总结
概述 由于项目中,微信前端和后端对接出现错误.所以Alpha测试分为微信小程序前端,管理员web测试. 测试工具选择 微信小程序的前端使用微信小程序开发工具测试. 管理员web使用web测试. 测试工 ...
- 从PRISM开始学WPF(二)Prism?
目录: 从PRISM开始学WPF(一)WPF? 从PRISM开始学WPF(二)Prism? 从PRISM开始学WPF(三)Prism-Region? 从PRISM开始学WPF(四)Prism-Modu ...
- ES6常用新特性
https://segmentfault.com/a/1190000011976770?share_user=1030000010776722 该文章为转载文章!仅个人喜好收藏文章! 1.前言 前几天 ...
- php的调试工具xdebug
zend_extension = "D:/developsoftware/wamp/bin/php/php5.5.12/zend_ext/php_xdebug-2.2.5-5.5-vc11- ...
- emqtt 试用(六)系统主题
$SYS-系统主题 EMQ 消息服务器周期性发布自身运行状态.MQTT 协议统计.客户端上下线状态到 $SYS/ 开头系统主题. $SYS 主题路径以 "$SYS/brokers/{node ...
- Linux CentOS7.0 (03)安装验证 docker
一.安装docker 1.升级 Linux 的软件包和内核 sudo yum update 2.安装 docker (1) sudo yum install docker (2).验证docker安 ...
- greenplum集群某台机器磁盘占用100%处理方式
一.问题描述 使用gpfdist往集群中导入大量数据, 一段时间后连接退出,集群无法连接 二.问题定位 使用如下命令查看: gpstate -s mdw-:gpadmin-[INFO]:- Segme ...