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} ...
随机推荐
- 想不到的:js中加号操作符
研究js加号操作符的时候,无意中试验了一个 console.log({} + "str");//NaN 发现结果居然是NaN,这让我百思不得其解. 我查阅资料,js高级编程里是这样 ...
- Transaction 事务简单详解
Transaction 也就是所谓的事务了,通俗理解就是一件事情.从小,父母就教育我们,做事情要有始有终,不能半途而废. 事务也是这样,不能做一半就不做了,要么做完,要么就不做.也就是说,事务必须是一 ...
- pip安装selenium报错:Read timed out
今天打算把selenium降级重新安装,发现安装时总是失败,报如下错误: raise ReadTimeoutError(self._pool, None, 'Read timed out.') pip ...
- 网络1712--c语言嵌套循环作业总结
1.助教有话说 首先,每周一篇的博客作业是很有必要的:编程的过程不仅仅是会敲几行代码.能够通过PTA就大吉大利了,你更应该做到的是梳理代码思路,通过与他人代码思路的比对,取其精华,进而不断进阶,才能逐 ...
- 关于python中argsort()函数的使用
在实现<机器学习实战>中kNN代码时遇到需要将计算好的距离进行排序,即可使用argsort()函数,在此依据个人理解对该函数进行简单的介绍. 总的来说,argsort()函数是对数组中的元 ...
- JAVA对象克隆
1> 为了获取对象的一份拷贝,我们可以利用Object类的clone()方法. 2> 在派生类中覆盖基类的clone(),并声明为public.3> 在派生类的clone()方法中, ...
- IT学习逆袭的新模式,全栈实习生,不8000就业不还实习费
大家好: 我是马伦,也就是多年耕耘在IT培训一线的老马.老马一直怀揣普惠教育梦想初心,一直为莘莘学子能获得高质量的IT教育服务而奋斗. 之前老马在IT培训机构任职讲师多年,也有丰富的教学管理经验.接触 ...
- confluence搭建详情
Confluence安装&破解&汉化 编辑时间: 2017年7月7日18:01:13 1.介绍 Atlassian Confluence(简称Confluence)是一个专业的wiki ...
- JWT(JSON Web Token) 多网站的单点登录,放弃session
多个网站之间的登录信息共享, 一种解决方案是基于cookie - session的登录认证方式,这种方式跨域比较复杂. 另一种替代方案是采用基于算法的认证方式, JWT(json web token) ...
- GIT入门笔记(18)- 标签创建和管理
git tag <name>用于新建一个标签,默认为HEAD,也可以指定一个commit id: git tag -a <tagname> -m "blablabla ...