Description

给定正整数N,R。求

Input

第一行一个数 T,表示有 T 组测试数据。
接下来 T 行,每行两个正整数 n,r。

Output

输出 T 行,每行一个整数表示答案。

Sample Input

3
3 5
3 6
3 7

Sample Output

3
1
-1

HINT

对于 100% 的数据,满足 n≤10^9,r≤10^4,T≤10^4。
关于类欧几里得的介绍:ZYYS
设$x=\sqrt r$,则
$$
\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}\lfloor k*i \rfloor$
$k=\frac{a*x+b}{c}$  这里x等于根号r
类欧的套路,将其转化为函数含义,也就是:
函数$y=k*x$与x轴,与$x=1$和$x=n$围成的梯形有多少整点
为了方便,这里不考虑函数线上的整点,而在开始特判(显然有整点代表x为整数)
如果$k<1$
那么有
$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的更多相关文章

  1. ●杜教筛入门(BZOJ 3944 Sum)

    入门杜教筛啦. http://blog.csdn.net/skywalkert/article/details/50500009(好文!) 可以在$O(N^{\frac{2}{3}})或O(N^{\f ...

  2. BZOJ 3944 Sum

    题目链接:Sum 嗯--不要在意--我发这篇博客只是为了保存一下杜教筛的板子的-- 你说你不会杜教筛?有一篇博客写的很好,看完应该就会了-- 这道题就是杜教筛板子题,也没什么好讲的-- 下面贴代码(不 ...

  3. BZOJ 3944: Sum [杜教筛]

    3944: Sum 贴模板 总结见学习笔记(现在还没写23333) #include <iostream> #include <cstdio> #include <cst ...

  4. BZOJ.3944.Sum(Min_25筛)

    BZOJ 洛谷 不得不再次吐槽洛谷数据好水(连\(n=0,2^{31}-1\)都没有). \(Description\) 给定\(n\),分别求\[\sum_{i=1}^n\varphi(i),\qu ...

  5. bzoj 3944: Sum(杜教筛)

    3944: Sum Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 4930  Solved: 1313[Submit][Status][Discuss ...

  6. 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) ...

  7. 【刷题】BZOJ 3944 Sum

    Description Input 一共T+1行 第1行为数据组数T(T<=10) 第2~T+1行每行一个非负整数N,代表一组询问 Output 一共T行,每行两个用空格分隔的数ans1,ans ...

  8. 「bzoj 3944: Sum」

    题目 杜教筛板子了 #include<iostream> #include<cstring> #include<cstdio> #include<cmath& ...

  9. bzoj 3944: Sum【莫比乌斯函数+欧拉函数+杜教筛】

    一道杜教筛的板子题. 两个都是积性函数,所以做法是一样的.以mu为例,设\( f(n)=\sum_{d|n}\mu(d) g(n)=\sum_{i=1}^{n}f(i) s(n)=\sum_{i=1} ...

随机推荐

  1. Beta No.5

    今天遇到的困难: 前端大部分代码由我们放逐的组员完成,这影响到了我们解决"Fragment碎片刷新时总产生的固定位置"的进程,很难找到源码对应 新加入的成员对界面代码不熟悉. 我们 ...

  2. Java 密码学算法

    Java 密码学算法 候捷老师在< 深入浅出MFC 2e(电子版)>中引用林语堂先生的一句话: 只用一样东西,不明白它的道理,实在不高明 只知道How,不知道Why,出了一点小问题时就无能 ...

  3. 201621123057 《Java程序设计》第9周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 在上一周的总结上做了一点补充 1.2 选做:收集你认为有用的代码片段 2. 书面作业 本次作业题集集合 1. ...

  4. 20145237 实验五《Java网络编程》

    20145237 实验五<Java网络编程> 一.实验内容 •1.运行下载的TCP代码,结对进行,一人服务器,一人客户端: •2.利用加解密代码包,编译运行代码,一人加密,一人解密: •3 ...

  5. Scrum 冲刺 第二日

    Scrum 冲刺 第二日 目录 要求 项目链接 燃尽图 问题 今日任务 明日计划 成员贡献量 要求 各个成员今日完成的任务(如果完成的任务为开发或测试任务,需给出对应的Github代码签入记录截图:如 ...

  6. Android属性动画 nineoldandroids

    各种资源链接 nineoldandroids 任玉刚的五个图片滑动,点击menu http://blog.csdn.net/singwhatiwanna/article/details/1763998 ...

  7. SELinux与进程管理

  8. RE:1054652545 - 论自己是如何蠢死的

    1.Java web 项目中 login/list 文件夹中return "login/list" 反复读取不到对应的jsp文件 一周后检查出来的原因上一级文件夹login前面多出 ...

  9. UDP协议实现客户服务器数据交互

    UDP协议实现客户服务器数据交互 按照往常一样将今天自己写的题目答案写在了博客上习题:客户端循环发送消息给服务端,服务端循环接收,并打印出来,直到收到Bye就退出程序. package network ...

  10. 自定义SpringBoot启动banner

    序: springboot启动的时候会有一个启动logo似的东西,如图,这个logo似的东西叫做banner,本文小计修改此banner显示与关闭banner.没什么用,有兴趣可以玩玩-- 正文: 自 ...